git命令使用方法

Tortoise Git安裝包下載地址

https://tortoisegit.org/download/html

git安裝時祕鑰生成步驟

1. git config --global user.name xxx
2. git config --global user.email xxx@xxx
3. ssh-keygen -C xxx@xxx -t rsa
//第3步分爲下面3個小步驟 (
1)公鑰保存地址 按回車選擇默認 (2)私鑰密碼-爲了後續使用方便 設置爲空 (3)生成公鑰和私鑰

identification has been saved in /c/Users/xxx/.ssh/id_rsa.
public key has been saved in /c/Users/xxx/.ssh/id_rsa.pub.

// git公鑰------/c/Users/xxx/.ssh/id_rsa.pub.文件中的內容
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/pYFUKMZUPNJtjOdSQl74GH4JxAQ8F+EqaMoR9Yw+5VNW81eWrrbbSsjpEDPaZIbb0Sc89oJ4Uzi2lpHjhTujMmdzf2TrfOaGRa2+M5Ey4Z1MXuT4RVawrZ/PtK7tTI+eMKc
/NZqhcp9e+NYIVzbwUMqvAnx+OTgDF3RYmYWDcbvTX0AybOBd/NwV1BtR5PkPRHlGQN0Oi5wHmvXmP9WIQ9dAoi+w63mhL+c8a8Qu+PBZBiknzJRB1p9dtIOEPdq5ltGAqluEZ0FTEzet1qH0pAUaOxxEsZAhGpa9453rQJ433
Emg7hy30KomOQvFp64T6QlTGFKIg9EMm9t8Ny2r xxx@xxx

git推薦使用SSH協議的緣由
使用SSH協議能夠避免每次輸入密碼。前提是在帳戶裏配置好SSH祕鑰。 git@github.com開頭的就是SSH協議。 使用Https協議則會致使每次都會輸入用戶名和密碼。

push

 

git bash命令窗口和字體的大小設置

鼠標點擊git bash界面的標題欄,鼠標右鍵選擇git

// 窗口尺寸設置github

options --> windows -->修改行數(高度)+列數(寬度)算法

// 窗口字體設置windows

options --> text -->設置字體大小緩存

 

擴展安全

// 瞭解一下win7的命令窗口設置bash

http://article.pchome.net/content-1245289-all.html服務器

 

建立本地庫

// 從零開始建立
1
.git init 建立一個空的Git庫。在當前目錄中產生一個.git 的子目錄。之後,全部的文件變化信息都會保存到這個目錄下 2.git init --bare 建立備份倉庫(在服務器或者工程目錄之外路徑均可以建立的備份倉庫)

// 克隆已有倉庫建立
git clone /path/to/repository                                                             // 本地庫
git clone  git/ssh/http[s]/ftp[s]/file/rsync:username@ip/path/to/repository               // 遠端服務器
 
 

git clone的本質就是把「Git目錄」裏面的內容拷貝過來,通常的「Git目錄」裏有成千上萬的各類對象(提交對象,樹對象,二進制對象, tag對象......),若是逐一複製的話,其效率就可想而知。app

若是經過git、ssh協議傳輸,服務器端會在傳輸前把須要傳輸的各類對象先打好包再進行傳輸;而http(s)協議則會反覆請求要傳輸的不一樣對象。若是倉庫裏面的提交很少的話,前者和後者的效率相差很少;可是若倉庫裏有不少提交的話,git、ssh協議進行傳輸則會更有效率。不過如今Git對http(s)協議傳輸Git倉庫作了必定的優化,http(s)傳輸如今也能達到ssh協議的效率 

.git目錄的組成

COMMIT_EDITMSG         # 保存着上一次提交時的註釋信息 config # 項目的配置信息 description # 項目的描述信息 HEAD # 項目當前在哪一個分支的信息
index # 索引文件,git add以後要添加的內容暫存在這裏 hooks/ # 默認的「hooks」 腳本文件 info/ # 裏面有一個exclude文件,指定本項目要忽略的文件 #,看一下這裏 logs/ # 各個refs的歷史信息 objects/ # 這個目錄很是重要,裏面存儲都是Git的數據對象 # 包括:提交(commits), 樹對象(trees),二進制對象 #(blobs),標籤對象(tags)。
# 在objects目錄下,SHA串的前兩個字符做爲目錄名,後面的38個字符做爲文件名
refs/                       # 標識着你的每一個分支指向哪一個提交(commit)。

// 查看提交文件的內容,2d832d是SHA(安全hash算法)簽名值
$ git cat-file -p 2d832d

// 詳細請參考  本地倉庫的建立和構成

http://www.infoq.com/cn/news/2011/02/git-adventures-local-repository

 

配置選項

git config, -- 僅對當前項目

--global   --  對當前登陸者

--system -- 對全部登陸這臺電腦的人

git config -e --[local|global|system] 

工做流

本地和遠程工做流

你的本地代碼 由 git 維護的三棵「樹」組成。第一個是你的 工做目錄,它持有實際文件;第二個是 緩存區(Index/stage),它像個緩存區域,臨時保存你的改動;最後是本地倉庫( HEAD),指向你最近一次提交後的結果。

 

 

git clone 用於創建本地倉庫                     // origin 是git clone默認使用的遠程主機名

經過git clone獲取遠端git庫後,.git/config中的開發者信息不會被一塊兒clone過來。仍然須要爲本地庫的.git/config文件添加開發者信息。此外,開發者還須要本身添加 . gitignore文件。 
經過git clone獲取的遠端git庫,只包含了遠端git庫的當前工做分支。若是想獲取其它分支信息,須要使用 「git branch –r」 來查看, 若是須要將遠程的其它分支代碼也獲取過來,可使用命令 「 git checkout -b 本地分支名 遠程分支名」,
其中,遠程分支名爲 「git branch –r」 所列出的分支名, 通常是諸如「origin/分支名」的樣子。若是本地分支名已經存在, 則不須要「-b」參數。 
git fetch

從遠程獲取最新版本到本地,不會自動merge,比git pull更安全些。 
若是先使用 git fetch ,再使用git checkout nov/eclair_rocket,則是先從服務器上獲取最新的更新信息,而後從服務器上下載最新的代碼。


git pull 
從服務器的倉庫中獲取代碼,和本地代碼合併。等同於: Git fetch + Git merge
這條命令將從遠端git庫的遠端分支名獲取到本地git庫的一個本地分支中。其中,若是不寫本地分支名,則默認pull到本地當前分支。 若是你的本地分支已經有內容,則git pull會合並這些文件,若是有衝突會報警。 
和是針對全部分支進行的操做。也就是說即便我切換到一個次分支, 若是這個分支和遠端的分支已關聯了的話,那麼執行會把分支和分支都更新到遠端。

git pullgit pushalphagit pullmasteralpha

本地關聯遠程分支

git push --set-upstream origin 遠程分支名

推送改動

你的改動如今已經在本地倉庫的 HEAD 中了。執行以下命令以將這些改動提交到遠端倉庫:

git push origin master
git push不會自動合併文件。所以,若是git push時,發生了衝突,就會被後push的文件內容強行覆蓋,並且沒有什麼提示。 這在合做開發時是很危險的事情。 


能夠把master換成你想要推送的任何分支。 

若是你尚未克隆現有倉庫,並欲將你的倉庫鏈接到某個遠程服務器,你可使用以下命令添加:

git remote add origin <server>

如此你就可以將你的改動推送到所添加的服務器上去了

 

添加與提交

你能夠計劃改動(把它們添加到緩存區),使用以下命令:

git add dir1          # 添加dir1這個目錄,目錄下的全部文件都被加入 
git add f1 f2         # 添加f1,f2文件 

git add -u            #-u是update的縮寫,只監聽已經被加入的文件 將本地包括修改和刪除,不包括新增的文件和.gitignore中設置的忽略文件 添加到暫存區 

git add . #監聽工做區的狀態樹,把工做區狀態樹的全部變化提交到暫存區, 包括新增的和修改的,不包括刪除的文件和.gitignore中設置的忽略文件
git add -A            等於 git add . + git add -u
git add *             #將本地全部有改動的文件(包括.gitignore中要忽略的文件)都添加到git緩衝區以待提交


git rm --cache a.c    #刪除已提交到本地倉庫的文件

這是 git 基本工做流程的第一步;使用以下命令以實際提交改動:

git commit -m    "代碼提交信息"
git commit -a -m "代碼提交信息"      # git commit -a是把unstaged的文件變成staged(這裏不包括新建(untracked)的文件),而後commit
 
git commit --amend                 # 修改提交的commit(沒有push)
git commit --amend -m "comment"    # 修改commit註解

 

如今,你的改動已經提交到了 HEAD,可是還沒到你的遠端倉庫。

git刪除

git rm與git rm --cached

當咱們須要刪除暫存區分支上的文件, 同時工做區也不須要這個文件了, 可使用

1 git rm file_path
2 git commit -m 'delete somefile'
3 git push

當咱們須要刪除暫存區分支上的文件, 但本地又須要使用, 只是不但願這個文件被版本控制, 可使用

git rm --cached file_path
git commit -m 'delete remote somefile'
git push

 

 

分支

新建一個跟蹤遠程分支的本地分支

git checkout -b  [branch] origin/[branch]

分支是用來將特性開發絕緣開來的。在你建立倉庫的時候,master 是「默認的」。在其餘分支上進行開發,完成後再將它們合併到主分支上。

 

git checkout -b feature_x建立一個叫作「feature_x」的分支,並切換過去:

切換回主分支:

git checkout master

再把新建的分支刪掉:

git branch -d feature_x

除非你將分支推送到遠端倉庫,否則該分支就是 不爲他人所見的

git push origin <branch>

 重命名本地分支

git branch -m  branch-old-name  branch-new-name

 刪除遠程分支

git push origin --delete test_branch

 

分支切換

git 切換分支時,若是當前分支開發到一半,沒有提交,會被帶到另外一分支

使用git stash命令暫存

使用git stash pop 恢復

使用git stash list  查看暫存內容

使用git stash clear 刪除暫存內容

更新

要更新你的本地倉庫至最新改動,執行:

git pull  origin <remote-branch> <local-branch>
git fetch origin <remote-branch>

git pull --ff 出現編輯界面的退出方法

先按esc,而後shift+:,wq就是保存退出

標籤

在軟件發佈時建立標籤,是被推薦的。這是個舊有概念,在 SVN 中也有。能夠執行以下命令以建立一個叫作 1.0.0 的標籤:

git tag 1.0.0 1b2e1d63ff

1b2e1d63ff 是你想要標記的提交 ID 的前 10 位字符。使用以下命令獲取提交 ID:

git log

你也能夠用該提交 ID 的少一些的前幾位,只要它是惟一的。

 // 給tag添加註釋

git tag -v1.4 -m 'my version 1.4'

 

// 顯示tag版本記錄
git show tag-name

// 一次性推送全部tag到遠程服務器
git push origin --tags
// 取出打過tag的某個版本
git checkout -b branch_name tag_name
// 刪除tag時需注意,若是向遠程服務器提交了tag,則刪除tag時,不只要刪除本地的tag,還要刪除遠程的tag

// 刪除本地的tag命令是

git tag -d tag-name

// 刪除遠程tag的命令是

git push origin --delete tag-name

替換本地改動

假如你作錯事(天然,這是不可能的),你可使用以下命令替換掉本地改動:

git checkout -- <filename>

此命令會使用 HEAD 中的最新內容替換掉你的工做目錄中的文件。已添加到緩存區的改動,以及新文件,都不受影響。

假如你想要丟棄你全部的本地改動與提交,能夠到服務器上獲取最新的版本並將你本地主分支指向到它:

git fetch origin master
git reset origin/master --hard

 

git 忽略文件的設置方式

可參考如下兩個網址

git ignore文件的三種設置方式[http://www.jianshu.com/p/267cd94f1d49 ]    

git ignore文件設置的具體語法[http://www.cnblogs.com/pylemon/archive/2012/07/16/2593112.html#3226325]

重點說一下踩過的坑:

.gitignore 文件能夠忽略本身。忽略的文件,只針對未跟蹤文件有效,對已加入版本庫的文件無效。

git check-ignore 可用來檢查所寫的忽略文件語法是否正確

 

忽略文件的原則是:

1.忽略操做系統自動生成的文件,好比縮略圖等;

2.忽略編譯生成的中間文件、可執行文件等,也就是若是一個文件是經過另外一個文件自動生成的,那自動生成的文件就不必放進版本庫,好比Java編譯產生的.class文件;

3.忽略你本身的帶有敏感信息的配置文件,好比存放口令的配置文件。

不須要從頭寫.gitignore文件,GitHub已經爲咱們準備了各類配置文件,只須要組合一下就可使用了,好比分別輸入Tags和SublimeText,在下面的網址中查詢忽略規則 https://www.gitignore.io/ 

 

git 分支合併

假設此時,你忽然接到一個電話說有個很嚴重的問題須要緊急修補,那麼能夠按照下面的方式處理:

  1. 返回到原先已經發布到生產服務器上的分支。
  2. 爲此次緊急修補創建一個新分支,並在其中修復問題。
  3. 經過測試後,回到生產服務器所在的分支,將修補分支合併進來,而後再推送到生產服務器上。
  4. 切換到以前實現新需求的分支,繼續工做。
$ git checkout -b iss53    // 在master分支上新建一個iss53分支

至關於執行下面這兩條命令:

$ git branch iss53
$ git checkout iss53

 

// 將hotfix分支合併到master

$ git checkout master

$ git merge hotfix --no-ff 

合併分支時,若是可能,Git會用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支信息。若是要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就能夠看出分支信息。

git merge 分支名 --no-ff -m" 本次合併添加的註釋信息" 

合併時發生衝突的提示信息

$ git merge iss53  

Auto-merging index.html

CONFLICT (content): Merge conflict in index.html

Automatic merge failed; fix conflicts and then commit the result.

合併狀態的查看

$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      index.html

no changes added to commit (use "git add" and/or "git commit -a")

 

任何包含未解決衝突的文件都會以未合併(unmerged)的狀態列出。Git 會在有衝突的文件里加入標準的衝突解決標記,能夠經過它們來手工定位並解決這些衝突。能夠看到此文件包含相似下面這樣的部分:

<<<<<<< HEAD
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
  please contact us at support@github.com
</div>
>>>>>>> iss53

能夠看到 ======= 隔開的上半部分,是 HEAD(即 master 分支,在運行 merge 命令時所切換到的分支)中的內容,下半部分是在 iss53 分支中的內容。解決衝突的辦法無非是兩者選其一或者由你親自整合到一塊兒。好比你能夠經過把這段內容替換爲下面這樣來解決:

這個解決方案各採納了兩個分支中的一部份內容,並且我還刪除了 <<<<<<<======= 和 >>>>>>> 這些行。在解決了全部文件裏的全部衝突後,運行 git add 將把它們標記爲已解決狀態(譯註:實際上就是來一次快照保存到暫存區域。)。由於一旦暫存,就表示衝突已經解決。

 

git branch -d studyGit    // 對studyGit分支進行合併後,才能刪除得了studyGit分支

git branch -D studyGit    // 強制刪除studyGit分支

再運行一次 git status 來確認全部衝突都已解決:

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   index.html

若是以爲滿意了,而且確認全部衝突都已解決,也就是進入了暫存區,就能夠用 git commit 來完成此次合併提交。提交的記錄差很少是這樣:

git rebase 合併出錯

git rebase --abort 終止合併

git rebase --continue 繼續合併

 

Git - 分支的新建與合併可參考下文

https://git-scm.com/book/zh/v1/Git-%E5%88%86%E6%94%AF-%E5%88%86%E6%94%AF%E7%9A%84%E6%96%B0%E5%BB%BA%E4%B8%8E%E5%90%88%E5%B9%B6

 

git merge和git rebase 合併分支的差別

http://gitbook.liuhui998.com/4_2.html

git rebase生成的歷史記錄線比較好看

 

開發過程當中,若你在開發的branch功能比較多, commit的量也比較多時,建議使用rebase將你如今的branch整理過再合併回主幹,這樣會產生較漂亮的線

 

git版本庫回滾

1、git checkout the_branch

2、git pull

3、git branch the_branch_backup //備份一下這個分支當前的狀況

4、git reset --hard the_commit_id //把the_branch本地回滾到the_commit_id

5、git push origin :the_branch //刪除遠程 the_branch

6、git push origin the_branch //用回滾後的本地分支從新創建遠程分支

7、git push origin :the_branch_backup //若是前面都成功了,刪除這個備份分支
 
--soft    回退commit

--mixed    回退commit和stage

--hard     回退commit stage workspace

//本地倉庫回退到某個版本

git reset version_hash --hard

// 推送至遠程倉庫,使遠程倉庫回退到某個版本

git push 遠程主機名 遠程目錄  -f
 

Git的版本回退速度很是快,由於Git在內部有個指向當前版本的HEAD指針,當你回退版本的時候,Git僅僅是把HEAD從指向append GPL

版本號不必寫全,前幾位就能夠了,Git會自動去找。固然也不能只寫前一兩位,由於Git可能會找到多個版本號,就沒法肯定是哪個了。

git reset --hard 3628164

 

git log退出

在英文輸入狀態下,按Q就退出了

git revert和git reset的區別

http://blog.csdn.net/caz28/article/details/43602879

git revert 和 git reset 只有在回退最近的一次提交時,纔是等效的

(1)git revert會使提交記錄增多,git reset會使提交記錄減小

(2)git revert只是撤銷指定版本的提交,git reset是回捲,會撤銷指定版本以後的全部提交

git reset HEAD~3
reset HEAD~3 圖

git revert HEAD~3

revert HEAD~3 圖

(3) git reset只能針對本地操做,不能對遠程服務器執行一樣的操做。

git revert和get reset的後悔藥

revert後若是不想撤銷了,看一下log,reset回去就能夠了。
reset後後悔了怎麼辦,沒有log了!不要緊,下面命令能夠查到更多commit ID:
git reflog
reflog 圖
再輸入:
git reset <commit ID>

這個commit ID是上次reset前的ID,就能夠回退會reset之前狀態了。

在Git中,老是有後悔藥能夠吃的

git reflog  記錄你操做的每一條指令

  • HEAD指向的版本就是當前版本,所以,Git容許咱們在版本的歷史之間穿梭,使用命令git reset --hard commit_id

  • 穿梭前,用git log能夠查看提交歷史,以便肯定要回退到哪一個版本。

  • 要重返將來,用git reflog查看命令歷史,以便肯定要回到將來的哪一個版本。

// 可參考這篇文章 版本回退

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000

// git revert

http://samael65535.github.io/git/2013/01/18/git/

 

有用的貼士

內建的圖形化 git:
gitk
彩色的 git 輸出:
git config color.ui true
顯示歷史記錄時,只顯示一行註釋信息:
git config format.pretty oneline

若是嫌輸出信息太多,看得眼花繚亂的,能夠試試加上--pretty=oneline參數:

git log --pretty=oneline --abbrev-commit

你看到的一大串相似3628164...882e1e0的是commit id(版本號),和SVN不同,Git的commit id不是1,2,3……遞增的數字,而是一個SHA1計算出來的一個很是大的數字,用十六進制表示,並且你看到的commit id和個人確定不同,以你本身的爲準。爲何commit id須要用這麼一大串數字表示呢?由於Git是分佈式的版本控制系統,後面咱們還要研究多人在同一個版本庫裏工做,若是你們都用1,2,3……做爲版本號,那確定就衝突了。

在Git中,用HEAD表示當前版本,也就是最新的提交3628164...882e1e0(注意個人提交ID和你的確定不同),上一個版本就是HEAD^,上上一個版本就是HEAD^^,固然往上100個版本寫100個^比較容易數不過來,因此寫成HEAD~100

跟蹤分支的概念

遠程分支指的是(remote)/(branch)這種,表示對遠程的分支的引用. 遠程跟蹤分支指的是, 跟蹤遠程的分支, 好比說當你git clone的時候, 默認建立一個遠程分支origin/master, 和 遠程跟蹤分支 master(默認分支), 經過git check -b track_branch (remote)/(branch) 能夠建立一個跟蹤分支. 跟蹤分支主要用來描述當前和遠程分支的位置關係, 好比說origin/master分支比master多提交了兩次,意味着你須要將origin/master的分支合併到master. 這個位置關係是基於你最後一次同步遠程分支origin/master的. 好比說 若是master跟蹤了origin/master, 那我能夠在本地經過使用git pull origin(可省略master)來同步最新的提交.


 使用心得:

1.要看一下每條git命令的回顯,看看是否是你要執行的操做, 有沒有遺漏或報錯或者執行終止的狀況

2.對於異常操做,必定要保留現場,查明緣由,這樣記憶更深入。

 

 

想進一步瞭解git指令的話,可閱讀下面幾篇文章

git 入門級指令

https://github.com/guodongxiaren/LinuxTool/blob/master/git.md

git經常使用命令解說

http://zensheno.blog.51cto.com/2712776/490748

git經常使用命令總結

http://blog.csdn.net/a396901990/article/details/43428905

git簡明教程

http://shahdza.blog.51cto.com/2410787/1616345

比較系統的git教程

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256916071d599b3aed534aaab22a0db6c4e07fd0000

相關文章
相關標籤/搜索