本文適合作為一個速查手冊使用,希望深入了解 git 的同學,請前往 Pro Git 中文版 下載 《Pro Git》手冊進行學習
Cherish作為一名菜鳥程序員在剛剛接觸git時,雖然仔細閱讀了《Pro Git》的第一、二章,基本清楚了git的使用流程,然而在實際運用中,卻因為記不住各種常用的git 命令而常常畏手畏腳,經常因為使用了錯誤的git命令而把工作搞得焦頭爛額,因為不記得各種 git 命令,常常要在使用時臨時翻看手冊,在經歷過一番煎熬后,我下定決心要對常用的 git 技巧進行一個簡練概括的總結,以下是我結合參考資料和平時的日常使用總結出來的31個git 實用技巧。隨着在工作中更過使用場景的豐富,還會不斷添加新的技巧,不斷豐富和完善。
一、基本操作
1.如何新建倉庫?
1.1. 將尚未進行版本控制的本地目錄轉換為 Git 倉庫
- 進入該項目得目錄中;
$ cd /c/user/my_project
- 執行
git init
;
$ git init
- 使用
git add
追蹤已存在得項目文件;
$ git add *.c
- 使用
git commit
進行初始提交;
$ git commit -m 'initial project version' // 提交時添加comments
現在,你已經得到了一個存在被追蹤文件與初始提交的 Git 倉庫。
1.2 從其它服務器 克隆 一個已存在的 Git 倉庫
- 克隆命令:
git clone <url>
$ git clone https://github.com/libgit2/libgit2
- 如果你想在克隆遠程倉庫的時候,自定義本地倉庫的名字,你可以通過額外的參數指定新的目錄名:
$ git clone https://github.com/libgit2/libgit2 myName
Git 支持多種數據傳輸協議。 上面的例子使用的是 https:// 協議,不過你也可以使用 git:// 協議或者使用SSH 傳輸協議,比如 user@server:path/to/repo.git 。
2.如何查看當前項目中文件的狀態?
- 可以用 git status 命令查看哪些文件處於什么狀態(狀態信息比較詳細)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
- 使用
git status -s
命令或git status --short
命令 (狀態信息比較簡潔)
$ git status -s
- 最具體得查看方式:
git diff
,可具體到具體更改文本內容
$ git diff
3.如何跟蹤一個新添加的文件?
git add 文件名
$ git add xxx文件
4.如何暫存一個已修改得文件?
- 還是
git add 文件名
命令,這是一個多功能命令
$ git add xxx文件
5. add 添加已存在文件的所有變化(新創建的文件不會被添加)
- git add -a
$ git add -a
6. add 添加被修改(modified)和被刪除(deleted)文件,不包括新文件(new)
- git add -u
$ git add -u
7. 添加新文件(new)和被修改(modified)文件,不包括被刪除(deleted)文件
- git add .
$ git bash .
8.如何忽略某些無需納入 git 管理得文件?
- 創建一個
.gitignore
;
$ cat .gitignore
- 在該文件中添加需要忽略得文件;
*.[oa] // 忽略所有以 .o 或 .a 結尾的文件
*~ // 忽略所有名字以波浪符(~)結尾的文件
文件 .gitignore 的格式規范如下:
• 所有空行或者以 # 開頭的行都會被 Git 忽略。
• 可以使用標准的 glob 模式匹配,它會遞歸地應用在整個工作區中。
• 匹配模式可以以(/)開頭防止遞歸。
• 匹配模式可以以(/)結尾指定目錄。
• 要忽略指定模式以外的文件或目錄,可以在模式前加上嘆號(!)取反。
- 查看已暫存的將要添加到下次提交里的內容
$ git diff --staged
9.如何提交更新
- 使用
git status
查看文件狀態,看看是否有未暫存得文件;
$ git status
- 使用
git commit
提交更新
$ git commit
- 可以在 commit 命令后添加 -m 選項,將提交信息與命令放在同一行,可不必打開編輯器編輯提交信息
$ git commit -m "Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README
提交后它會告訴你,當前是在哪個分支(master)提交的,本次提交的完整 SHA-1 校驗和是什么(463dc4f),以及在本次提交中,有多少文件修訂過,多少行添加和刪改過
請記住,提交時記錄的是放在暫存區域的快照。 任何還未暫存文件的仍然保持已修改狀態,可以在下次提交時納入版本管理。
10.如何跳過暫存步驟,直接提交所有已跟蹤的修改過得文件
- 給 git commit 加上 -a 選項,Git 就會自動把所有已經跟蹤過的文件暫存起來一並提交,從而跳過 git add 步驟
$ git commit -a -m 'added new benchmarks'
11.如何將納入git版本管理的文件排除版本管理
要從 Git 中移除某個文件,就必須要從已跟蹤文件清單中移除,然后提交
- 用
git rm
命令完成此項工作,並連帶從工作目錄中刪除指定的文件
$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: PROJECTS.md
12.如何查看提交歷史?
git log
命令
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
13.如何撤銷對文件的修改?
- 如果你並不想保留對某個文件的修改怎么辦? 你該如何方便地撤消修改——將它還原成上次提
交時的樣子?
git checkout -- 文件名
$ git checkout -- 文件名
請務必記得 git checkout --
是一個危險的命令。 你對那個文件在本地的任何修改都會消失——Git 會用 最近提交的版本覆蓋掉它。
二、分支管理
14. 如何創建新的分支?
- 使用
git branch
命令,在當前分支的基礎上創建一個新的分支
$ git branch 分支名
15.如何切換分支?
- 使用
git checkout 分支名
命令,切換到一個已存在的分支
$ git checkout 分支名
- 通常我們會在創建一個新分支后立即切換過去,這可以用
git checkout -b <newbranchname>
一條命令搞定;
16.如何查看分支分叉歷史?
- 使用
git log
命令
17. 新建分支並切換到該分支上
$ git checkout -b 分支A
該語句是下面兩句的簡寫:
$ git branch 分支A
$ git checkout 分支A
18.合並目標分支(將目標分支合並到當前分支上)
git merge 目標分支
將目標分支合並到當前分支
$ git checkout master // 切到 master
$ git merge hotfix // 將hotfix 合並到 master
19. 如何刪除一個不需要的分支?
- 使用
git branch -d 分支名
$ git branch -d hotfix
Deleted branch hotfix (3a0874c)
20.在合並分支時遇到沖突怎么辦?
- 現象:
$ 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 做了合並,但是沒有自動地創建一個新的合並提交。 Git 會暫停下來,等待你去解決合並產生的沖突
任何因包含合並沖突而有待解決的文件,都會以未合並狀態標識出來。 Git 會在有沖突的文件中加入標准的沖突解決標記,這樣你可以打開這些包含沖突的文件然后手動解決沖突。
<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
please contact us at support@github.com
</div>
>>>>>>> iss53:index.html
為了解決沖突,你必須選擇使用由 ======= 分割的兩部分中的一個,或者你也可以自行合並這些內
容。上述的沖突解決方案僅保留了其中一個分支的修改,並且 <<<<<<< , ======= , 和 >>>>>>> 這些行被完全刪除了。在你解決了所有文件里的沖突之后,對每個文件使用 git add 命令來將其標記為沖突已解決。 一旦暫存這些原本有沖突的文件,Git 就會將它們標記為沖突已解決。
如果你想使用圖形化工具來解決沖突,你可以運行git mergetool
,該命令會為你啟動一個合適的可視化合並工具,並帶領你一步一步解決這些沖突.
21. git branch 命令如何使用?
git branch
命令不只是可以創建與刪除分支。 如果不加任何參數運行它,會得到當前所有分支的一個列表;
$ git branch
iss53
* master // * 代表當前指針所在位置
testing
git branch -v
查看每一個分支的最后一次提交;
$ git branch -v
iss53 93b412c fix javascript issue
* master 7a98805 Merge branch 'iss53'
testing 782fd34 add scott to the author list in the readmes
git branch --merged
查看哪些分支已經合並到當前分支;
$ git branch --merged
iss53
* master
三、遠程倉庫
22.如何查看遠程倉庫?
- 如果想查看你已經配置的遠程倉庫服務器,可以運行
git remote
命令。如果你已經克隆了自己的倉庫,那么至少應該能看到 origin ——這是 Git 給你克隆的倉庫服務器的默認名字;
$ git remote
origin
- 如果你的遠程倉庫不止一個,該命令會將它們全部列出;
23.如何添加遠程倉庫?
- 運行
git remote add <shortname> <url>
添加一個新的遠程 Git 倉庫,同時指定一個方便使用的簡寫;
$ git remote
origin
$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
pb https://github.com/paulboone/ticgit (fetch)
pb https://github.com/paulboone/ticgit (push)
24.如何從遠程倉庫中抓取(fetch)和拉取(pull)?
- 從遠程倉庫中獲得數據,可以執行
git fetch <remote>
;
$ git fetch <remote>
這個命令會訪問遠程倉庫,從中拉取所有你還沒有的數據。 執行完成后,你將會擁有那個遠程倉庫中所有分支的引用,可以隨時合並或查看。
必須注意 git fetch 命令只會將數據下載到你的本地倉庫——它並不會自動合並或修改你當前的工作。 當准備好時你必須手動將其合並入你的工作
- 用
git pull
命令來自動抓取后合並該遠程分支到當前分支
$ git pull
25.如何推送到遠程倉庫?
- 使用
git push <remote> <branch>
$ git push origin xxx分支
26.如何查看某個遠程倉庫的信息?
- 使用
git remote show <remote>
命令;
$ git remote show origin
* remote origin
Fetch URL: https://github.com/schacon/ticgit
Push URL: https://github.com/schacon/ticgit
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
它同樣會列出遠程倉庫的 URL 與跟蹤分支的信息。 這些信息非常有用,它告訴你正處於 master 分支,並且如果運行 git pull, 就會抓取所有的遠程引用,然后將遠程 master 分支合並到本地 master 分支。 它也會列出拉取到的所有遠程引用
27.如何移除遠程分支?
- 使用
git remote remove
或git remote rm
四、遠程分支
28. 如何操作遠程分支?
-
使用
git ls-remote <remote>
來顯示地獲取遠程引用的完整列表 -
使用
git remote show <remote>
獲取遠程分支的更多信息
29. 如何配置編輯注釋時使用得編輯器?
- 啟動的編輯器是通過 Shell 的環境變量 EDITOR 指定的,一般為 vim 或 emacs。 當然也可以按照 起步 介紹的方式, 使用
git config --global core.editor
命令設置你喜歡的編輯器。
30. 什么是跟蹤遠程分支?
- 從遠程分支 checkout 出來的本地分支,稱為 跟蹤分支 (tracking branch)。跟蹤分支是一種和某個遠程分支有直接聯系的本地分支。
- 在跟蹤分支里輸入
git push
,Git 會自行推斷應該向哪個服務器的哪個分支推送數據。同樣,在這些分支里運行git pull
會獲取所有遠程索引,並把它們的數據都合並到本地分支中來。
31. 如何自定義設置跟蹤分支?
- 使用
git checkout -b [branch] [remotename]/[branch]
$ git checkout -b [branch] [remotename]/[branch]
// 從遠程分支上的 branch 分支上牽出一個 名為branch 的本地分支
如果想要將本地分支與遠程分支設置為不同名字,可以使用如下示例命令:
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'
以上,本地分支 sf 會自動從 origin/serverfix 拉取。
這是一個十分常用的操作,所以 Git 提供了 --track 快捷方式。
- 自定義牽出遠程分支的快捷方式:
git checkout --track origin/serverfix
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
32.如何設置本地分支跟蹤某個遠程分支?
- 使用
git branch -u origin/serverfix
或者git branch --set-upstream-to origin/serverfix
可設置本地分支跟蹤某個遠程分支,或者修改正在跟蹤的遠程分支
$ git branch -u origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
33. 如何查看所有設置的跟蹤分支?
- 使用
git branch -vv
命令,這會將所有的本地分支列出來
$ git branch -vv
iss53 7e424c3 [origin/iss53: ahead 2] forgot the brackets
master 1ae2a45 [origin/master] deploying index fix
* serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
testing 5ea463a trying something new
這里可以看到 iss53 分支正在跟蹤 origin/iss53 並且
ahead'' 是 2,意味着本地有兩個提交還沒有推送到服務器上。 也能看到
master 分支正在跟蹤 origin/master 分支並且是最新的。 接下來可以看到 serverfix 分支正在跟蹤 teamone 服務器上的 server-fix-good 分支並且領先 2 落后 1,意味着服務器上有一次提交還沒有合並入同時本地有三次提交還沒有推送。 最后看到 testing 分支並沒有跟蹤任何遠程分支。
34. 如何統計最新的領先與落后數字?
- 使用命令
git fetch --all; git branch -vv
35. 如何刪除遠程分支?
- 使用帶有
--delete
選項的git push
命令來刪除一個遠程分支;
$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
- [deleted] serverfix
持續更新中。。。