標籤:

Git 必知必會

Git是目前世界上最先進的分散式版本控制系統。

參考文章:

如何優雅地使用 Git - 掘金

GIT 常見命令學習整理

GIT常用命令備忘

Git遠程操作詳解

一篇文章,教你學會Git

如何在 Git 中使用撤消操作

git使用中碰到的問題,持續更新

Git 的 4 個階段的撤銷更改

Git提交歷史的修改刪除合併 - 掘金

IDEA中分支切換error: The following untracked working tree files would be overwritten by checkout

直接執行git clean -d -fx即可。nn可能很多人都不明白-d,-fx到底是啥意思,n其實git clean -d -fx表示:刪除 一些 沒有 git add 的 文件;n git clean 參數 nn -n 顯示將要刪除的文件和目錄;nn -x -----刪除忽略文件已經對git來說不識別的文件nn -d -----刪除未被添加到git的路徑中的文件nn -f -----強制運行nn git clean -nnn git clean -dfnn git clean -fn

git reflog //該指令輸出詳細的操作歷史,包括提交,操作,修改等n修改注釋ngit commit --amend 或 git commit --amend -m "Fixes bug #42"nngitk 字符集編碼:ngit config --global gui.encoding utf-8 //在git GUI中使用UTF-8編碼 nn配置ngit config --global user.name "ihoey" # 設置git用戶名ngit config --global user.email "mail@ihoey.com" # 設置git郵箱ngit config --global color.ui true # 為true是終端著色nngit config --global alias.co checkout # 配置checkout的別名ngit config --global alias.ci commit # 配置commit的別名ngit config --global alias.cm commit # 配置commit的別名ngit config --global alias.st status # 配置status的別名ngit config --global alias.br branch # 配置branch的別名ngit config --global alias.cp cherry-pick # 配置cherry-pick的別名n git config --global alias.rb rebase # 配置rebase的別名nngit config --global core.editor "mate -w" # 設置Editor使用textmatengit config -l # 列舉所有配置n#用戶的git配置文件~/.gitconfignnSSH 秘鑰nssh-keygen -t rsa -C "mail@ihoey.com"n# 連續3個回車。如果不需要密碼的話。n# 最後得到了兩個文件:id_rsa和id_rsa.pub,在~/.ssh/文件夾下面n# id_rsa為你的私鑰,不可以告訴別人n# id_rsa.pub為你的公鑰,一般會放在你的伺服器做ssh登錄,或者放在github上面nn基本命令n創建git倉庫 git initn添加文件到暫存區 git add fileName / git add .n提交文件到倉庫 git commit -m "版本提交信息"n查看文件提交狀態 git statusn查看文件修改的信息 git diff readme.txtnngit help <command> # 顯示command的helpngit show # 顯示某次提交的內容ngit show $idngit checkout -- <file> # 拋棄工作區修改ngit checkout . # 拋棄工作區修改ngit add <file> # 將工作文件修改提交到本地暫存區ngit add . # 將所有修改過的工作文件提交暫存區ngit rm <file> # 從版本庫中刪除文件ngit rm <file> --cached # 從版本庫中刪除文件,但不刪除文件ngit reset <file> # 從暫存區恢復到工作文件ngit reset -- . # 從暫存區恢復到工作文件ngit reset --hard # 恢復最近一次提交過的狀態,即放棄上次提交後的所有本次修改ngit reset SHA1 ID # 恢復指定提交ngit commit -m "some comments"ngit revert <$id> # 恢復某次提交的狀態,恢復動作本身也創建了一次提交對象ngit revert HEAD # 恢復最後一次提交的狀態nn查看文件ngit diff <file> # 比較當前文件和暫存區文件差異ngit diffngit diff <$id1> <$id2> # 比較兩次提交之間的差異ngit diff <branch1>..<branch2> # 在兩個分支之間比較ngit diff --staged # 比較暫存區和版本庫差異ngit diff --cached # 比較暫存區和版本庫差異ngit diff --stat # 僅僅比較統計信息nn查看提交記錄ngit logngit log <file> # 查看該文件每次提交記錄ngit log -p <file> # 查看每次詳細修改內容的diffngit log -p -2 # 查看最近兩次詳細修改內容的diffngit log --stat # 查看提交統計信息nn分支管理ngit branch -l # 查看本地分支ngit branch -r # 查看遠程分支ngit branch <new_branch> # 創建新的分支ngit branch -v # 查看各個分支最後提交信息ngit branch --merged # 查看已經被合併到當前分支的分支ngit branch --no-merged # 查看尚未被合併到當前分支的分支ngit checkout <branch> # 切換到某個分支ngit checkout -b <new_branch> # 創建新的分支,並且切換過去ngit checkout -b <new_branch> <branch> # 基於branch創建新的new_branchngit checkout $id # 把某次歷史提交記錄checkout出來,但無分支信息,切換到其他分支會自動刪除ngit checkout $id -b <new_branch> # 把某次歷史提交記錄checkout出來,創建成一個分支ngit branch -d <branch> # 刪除某個分支ngit branch -D <branch> # 強制刪除某個分支 (未被合併的分支被刪除的時候需要強制)nn強行切換分支ngit checkout -f branch_namenn強制checkout分支覆蓋本地文件ngit checkout -f branchnamenn分支合併和rebasengit merge <branch> # 將branch分支合併到當前分支ngit merge --no-ff <branch> # 不要Fast-Foward合併,這樣可以生成merge提交ngit rebase master <branch> # 將master rebase到branch,相當於:ngit checkout <branch> && git rebase master && git checkout master && git merge <branch>n

  • 在我們操作過程中。merge操作遇到衝突的時候,當前merge不能繼續進行下去。手動修改衝突內容後,add 修改,commit 就可以了。
  • 而rebase 操作的話,會中斷rebase,同時會提示去解決衝突。解決衝突後,將修改add後執行git rebase –continue繼續操作,或者git rebase –skip忽略衝突。

Git暫存管理ngit stash # 暫存ngit stash pop # 恢復暫存ngit stash list # 列所有stashngit stash apply # 恢復暫存的內容ngit stash drop # 刪除暫存區nngit stash(gsta):將所有暫存區的文件移動到「儲藏區」,類似於另一種類型的工作區ngit stash list:查看儲藏隊列(Stash lists)ngit stash apply:將最近一次儲藏恢復到暫存區(可以用類似 git stash apply stash@{num}(num從0開始計數) 的命令來使用在隊列中的任意一個儲藏(stashes))ngit stash clear:清空儲藏隊列ngit stash save "name of the stash":為儲藏設置命名ngit stash pop(gstp):將最近一次儲藏恢復到暫存區並從儲藏隊列刪除此儲藏ngit stash drop(gstd):從儲藏隊列刪除最近一次儲藏(stash@{0})(git stash drop stash@{num} 從儲藏隊列刪除指定儲藏)nn遠程分支管理ngit pull # 抓取遠程倉庫所有分支更新併合併到本地ngit pull --no-ff # 抓取遠程倉庫所有分支更新併合併到本地,不要快進合併ngit fetch origin # 抓取遠程倉庫更新ngit merge origin/master # 將遠程主分支合併到本地當前分支ngit checkout --track origin/branch # 跟蹤某個遠程分支創建相應的本地分支ngit checkout -b <local_branch> origin/<remote_branch> # 基於遠程分支創建本地分支,功能同上ngit push # push所有分支ngit push origin master # 將本地主分支推到遠程主分支ngit push -u origin master # 將本地主分支推到遠程(如無遠程主分支則創建,用於初始化遠程倉庫)ngit push origin <local_branch> # 創建遠程分支, origin是遠程倉庫名ngit push origin <local_branch>:<remote_branch> # 創建遠程分支ngit push origin :<remote_branch> #先刪除本地分支(git br -d <branch>),然後再push刪除遠程分支nngit刪除遠程分支ngit push origin :branch-name //origin前面必須有空格,表示push一個空分支到遠程分支,即可刪除遠程分支。注意:這個操作需要擁有force push的許可權nn清空git暫存區ngit reset HEAD //可以清空之前git add 的內容nnGit遠程倉庫管理ngit remote -v # 查看遠程伺服器地址和倉庫名稱ngit remote show origin # 查看遠程伺服器倉庫狀態ngit remote add origin git@github.com:ihoey/blog.git # 添加遠程倉庫地址ngit remote set-url origin git@github.com:ihoey/blog.git # 設置遠程倉庫地址(用於修改遠程倉庫地址)ngit remote rm <repository> # 刪除遠程倉庫nn創建遠程倉庫ngit clone --bare ihoey.com blog.git # 用帶版本的項目創建純版本倉庫nscp -r my_blog.git git@ihoey.com:~ # 將純倉庫上傳到伺服器上nmkdir blog.git && cd blog.git && git --bare init # 在伺服器創建純倉庫ngit push -u origin master # 客戶端首次提交ngit push -u origin develop # 首次將本地develop分支提交到遠程develop分支,並且trackngit remote set-head origin master # 設置遠程倉庫的HEAD指向master分支nn設置跟蹤遠程庫和本地庫ngit branch --set-upstream master origin/master #masterngit branch --set-upstream develop origin/develop #developnn其他命令nmkdir XX #(創建一個空目錄 XX指目錄名)npwd #顯示當前目錄的路徑。ncat XX #查看XX文件內容nrm XX #刪除文件n

命令別名設置:

gitk --all & //打開git 圖形化界面ngit fetch --all //刷新工作區 ngit remote -v //查看遠端地址ngit checkout -b dbg_master -t origin/master //基於遠端master分支創建dbg_master分支ngit merge --squash <branch>:將多次提交合併成一個,然後git add .;git commit -m "XXXXX";git push origin XXXX...n ngit push # push所有分支ngit push origin master # 將本地主分支推到遠程主分支ngit push -u origin master # 將本地主分支推到遠程(如無遠程主分支則創建,用於初始化遠程倉庫)ngit push origin <local_branch> # 創建遠程分支, origin是遠程倉庫名ngit push origin local-branch #將當前local-branch 分支推送一個遠程local-branch分支,本地分支和遠程分支同名ngit push origin <local_branch>:<remote_branch> # 創建遠程分支,將local_branch代碼推送到remote_branch分支ngit push origin :<remote_branch> #先刪除本地分支(git br -d <branch>),然後再push刪除遠程分支n n 對最近一次commit的進行修改:git commit -a –amendnn Git pull 強制覆蓋本地文件n git fetch --all n git reset --hard origin/master n git pullnngit remote add origin https://git.oschina.net/duandaoke/os.git要求服務已經建立同名倉庫ngit remote # 顯示遠程倉庫ngit remote -v # 顯示遠程倉庫詳情ngit remote show origin # 顯示 origin 遠程庫的詳情nnnnrebase的衝突解決nn 解決完一個補丁應用的衝突後,執行下面命令標記衝突已解決(也就是把修改內容加入緩存) n git add -u //註:-u 表示把所有已track的文件的新的修改加入緩存,但不加入新的文件。n 然後執行下面命令繼續rebase:n git rebase --continue //有衝突繼續解決,重複這這些步驟,直到rebase完成。n 如果中間遇到某個補丁不需要應用,可以用下面命令忽略:n git rebase --skip n 如果想回到rebase執行之前的狀態,可以執行:n git rebase --abort //放棄rebase n 註:rebase之後,不需要執行commit,也不存在新的修改需要提交,都是git自動完成。nnnncherry-pick的衝突解決nn 解決完一個補丁應用的衝突後,執行下面命令標記衝突已解決(也就是把修改內容加入緩存) n git add -u //註:-u 表示把所有已track的文件的新的修改加入緩存,但不加入新的文件。n 然後執行下面命令繼續rebase:n git cherry-pick --continue //有衝突繼續解決,重複這這些步驟,直到cherry-pick完成。n 如果中間遇到某個補丁不需要應用,可以用下面命令忽略:n git cherry-pick --skip n 如果想回到rebase執行之前的狀態,可以執行:n git cherry-pick --abort //放棄cherry-pickn 註:cherry-pick之後,不需要執行commit,也不存在新的修改需要提交,都是git自動完成。nn n 手動編輯衝突的文件,使其內容和master_mlc分支上的內容一致, n 然後git add此文件,最後執行git cherry-pick –continue即可。 nnn1、git刪除遠程分支ngit push origin :branch-name //origin前面必須有空格,表示push一個空分支到遠程分支,即可刪除遠程分支。注意:這個操作需要擁有force push的許可權n2、清空git暫存區ngit reset HEAD //可以清空之前git add 的內容n

git clean命令用來從你的工作目錄中刪除所有沒有tracked過的文件.n git clean經常和git reset --hard一起結合使用. 記住reset隻影響被track過的文件, 所以需要clean來刪除沒有track過的文件. 結合使用這兩個命令能讓你的工作目錄完全回到一個指定的<commit>的狀態.n用法nnn刪除當前目錄下沒有被track過的文件和文件夾.n git clean -xfnnn下面的例子要刪除所有工作目錄下面的修改, 包括新添加的文件. 假設你已經提交了一些快照了, 而且做了一些新的開發.ngit reset --hardngit clean -dfn運行後, 工作目錄和緩存區回到最近一次commit時候一摸一樣的狀態, git status會告訴你這是一個乾淨的工作目錄, 又是一個新的開始了.n

git config --global gui.encoding utf-8 //在git GUI中使用UTF-8編碼 n//git 回滾到之前某一commitngit reset –hard 8ff24a6803173208f3e606e32dfcf82db9ac84d8nnn在使用Git的時候,經過幾次提交後,發現需要回退到早些時候的狀態.例如: n7edb8524a xxxxxxxxxxxxxxxxxx n83dae5691 xxxxxxxxxxxxxxxxxx n45eadd642 xxxxxxxxxxxxxxxxxx n657834ade xxxxxxxxxxxxxxxxxxn假設現在處於7edb8524a 狀態,現在我想回退到657834ade時的狀態,此時可以 ngit reset –hard 7edb8524a n然後 ngit reset –soft 657834ade n會將之間的修改全部進行revert,然後在進行add commit操作就行了.n另外許可權足夠的話,可以從657834ade 拉一個分支出來,然後將遠程分支 n刪除,再將拉出來的分支push到遠程倉庫上,成為原來的分支,也可以實現回退到 n657834ade 的目的.此方法不會保留中間的各種修改信息和狀態.nnn根據–soft –mixed –hard,會對working tree和index和HEAD進行重置:n git reset –mixed:此為默認方式,不帶任何參數的git reset,即時這種方式,它回退到某個版本,只保留源碼,回退commit和index信息n git reset –soft:回退到某個版本,只回退了commit的信息,不會恢復到index file一級。如果還要提交,直接commit即可n git reset –hard:徹底回退到某個版本,本地的源碼也會變為上一個版本的內容nn已經pushn對於已經把代碼push到線上倉庫,你回退本地代碼其實也想同時回退線上代碼,回滾到某個指定的版本,線上,線下代碼保持一致.你要用到下面的命令nnrevertngit revert用於反轉提交,執行evert命令時要求工作樹必須是乾淨的.ngit revert用一個新提交來消除一個歷史提交所做的任何修改.nrevert 之後你的本地代碼會回滾到指定的歷史版本,這時你再 git push 既可以把線上的代碼更新.(這裡不會像reset造成衝突的問題)nnrevert 使用,需要先找到你想回滾版本唯一的commit標識代碼,可以用 git log 或者在adgit搭建的web環境歷史提交記錄里查看.ngit revert c011eb3c20ba6fb38cc94fe5a8dda366a3990c61n通常,前幾位即可ngit revert c011eb3nngit revert是用一次新的commit來回滾之前的commit,git reset是直接刪除指定的commitn看似達到的效果是一樣的,其實完全不同.n

合理的命令別名設置可以大大減少輸入,有助於提高工作效率,建議遵守下述別名設置:

git config --global alias.ci commitngit config --global alias.co checkoutngit config --global alias.st statusngit config --global alias.rb rebasengit config --global alias.ll 「log --oneline --decorate --color」ngit config --global alias.lc 「log --graph --color」 n

正確的回車換行設置,避免 Unix 和 Windows 下開發的回車換行的轉換問題。

(Windows 下)ngit config --global core.autocrlf truengit config --global core. safecrlf warnnn(Linux 下)ngit config --global core.autocrlf inputngit config --global core. safecrlf warnn

基本命令

git config --global user.name "Your Name"ngit config --global user.email "youremail@example.com"ngit config --global core.editor <your favorite editor here>nEx: git config --global core.editor vimnngit init:初始化一個repo,初始化本地git倉庫(創建新倉庫)n

Commit 結構

git status(gst):查看 repo 狀態n工作區:n.git 目錄n暫存區n工作目錄n

git add <filename>(ga):添加一個文件到暫存區ngit add .(gaa):添加所有文件到暫存區ngit add *.js:添加所有後綴為js的文件到暫存區ngit rm --cached <file>:從暫存區刪除一個新文件ngit commit -m "My first commit"(gcmsg):創建一次帶 message 的提交ngit commit -v -a(gca):n-v是 verbose 的縮寫,會在底部顯示差異信息和更多有意義的信息n-a 類似於 git add .,會添加所有被修改和刪除的文件,但會忽略新創建的文件nngit help <command>:查看對應命令的幫助手冊ngit log(glg,glgg,glo, glog):查看項目的提交歷史n

暫存區管理

git reset HEAD <filename>(grh):從暫存區刪除一個被修改的文件ngit reset HEAD(grh):從暫存區刪除所有被修改的文件ngit checkout <filename>(gco):從暫存區刪除一個被修改的文件,並撤銷文件的更改 // git checkout .ngit commit -m "My first commit" --amend:添加文件/更改在暫存區的最後一次提交ngit commit -v -a --amend(gca!):添加文件/更改在暫存區的最後一次提交n.gitignore:告訴git,哪些文件不被加入版本跟蹤n可以使用 git add <filename> -f 命令添加一個不被版本跟蹤的文件n

git diff <filename>(gd):查看基於當前文件的最後一次提交的更改差異ngit diff (gd):查看基於所有文件的最後一次提交的更改差異ngit reset HEAD~2 --soft:從項目提交歷史中刪除最近兩次提交,但不丟棄文件的更改ngit reset HEAD~2 --hard:從項目提交歷史中刪除最近兩次提交,但會丟棄文件的更改和在(最後兩次)提交中創建的新文件ngit reset <commit> --soft --hard:n--soft:將所有被更改的文件回溯到「待提交」狀態n--hard:commit 之後,對被git追蹤的文件的任何更改都被丟棄n

git reflog:顯示包括"被撤銷"在內的所有提交ngit merge <commit hash>:重新提交(restore the commit)ngit clean -f:刪除工作目錄中不被git進行版本追蹤的文件n

Stashed & BranchesStash

git stash(gsta):將所有暫存區的文件移動到「儲藏區」,類似於另一種類型的工作區ngit stash list:查看儲藏隊列(Stash lists)ngit stash apply:將最近一次儲藏恢復到暫存區(可以用類似 git stash apply stash@{num}(num從0開始計數) 的命令來使用在隊列中的任意一個儲藏(stashes))ngit stash clear:清空儲藏隊列ngit stash save "name of the stash":為儲藏設置命名ngit stash pop(gstp):將最近一次儲藏恢復到暫存區並從儲藏隊列刪除此儲藏ngit stash drop(gstd):從儲藏隊列刪除最近一次儲藏(stash@{0})(git stash drop stash@{num} 從儲藏隊列刪除指定儲藏)n

Branch

git checkout -b dev(gco):創建 dev 分支並從當前分支切換到 dev 分支 // git checkout -b dbg_master -t origin/master //基於master分支創建dbg_master分支ngit branch(gb):查看所有分支ngit checkout master(gcm):切換到主分支ngit merge <branch>(gm):合併分支ngit rebase master:先將 master 上的更改合併到當前分支,再添加當前分支的更改。如果有衝突,解決衝突後加 --continue 參數繼續合併ngit branch -d <branch>: 刪除分支,-D 則強制刪除分支ngit merge <branch> --squash:將多次提交合併成一個,其流程如下:nnnn# Go to the `master` branchngit checkout mastern# Create a temp branchngit checkout -b tempn# Merge the feature/x branch into the temp using --squashngit merge feature/x --squashn# See the new modifications/files in the Staging Areangit statusn# Create the unified commitngit commit -m "Add feature/x"n# Delete the feature/x branchngit branch -D feature/xn

  • rebase 和 merge 的區別:

rebase:n提交歷史(的展示)是線性的n缺點:會刪除最近一個 commit,然後創建一次新的 commitn如果已提交到遠程,不要使用 rebasennmerge:n提交歷史(的展示)是分叉的n對於兩個分支的合併,會創建一個次新的 commitn

遠程倉庫管理

git remote add <name> <url>:添加一個將被追蹤的遠程倉庫ngit remote rm <name>:移除一個遠程倉庫ngit push <remote> <remote-branch>(gp,ggp):將當前分支的本地 commit 推送到遠程倉庫ngit fetch <remote> <remote-branch>:拉取遠程倉庫的最新 commit 到當前(本地)分支(<remote>/<branch>),不會合併ngit pull <remote> <remote-branch>(gl,ggl):拉取遠程倉庫的最新 commit 到當前(本地)分支,並自動 mergengit pull --rebase(gup):以 rebase 的方式進行合併,而不是 mergen

其它有用的命令

git tag <name>:創建一個 tag(如:v1.3)ngit push --tags:將本地 tags 推送到遠程倉庫ngit push <tag>:推送指定的本地 tag 到遠程n

展示幫助信息ngit help -gnn回到遠程倉庫的狀態n拋棄本地所有的修改,回到遠程倉庫的狀態。ngit fetch --all && git reset --hard origin/masternn重設第一個commitn也就是把所有的改動都重新放回工作區,並清空所有的commit,這樣就可以重新提交第一個commit了ngit update-ref -d HEADnn展示工作區和暫存區的不同n輸出工作區和暫存區的different(不同)。ngit diffnn還可以展示本地倉庫中任意兩個commit之間的文件變動:ngit diff <commit-id> <commit-id>nn展示暫存區和最近版本的不同n輸出暫存區和本地最近的版本(commit)的different(不同)。ngit diff --cachednn展示暫存區、工作區和最近版本的不同n輸出工作區、暫存區 和本地最近的版本(commit)的different(不同)。ngit diff HEADnn快速切換分支ngit checkout -nn刪除已經合併到master的分支ngit branch --merged master | grep -v ^*| master | xargs -n 1 git branch -dnn展示本地分支關聯遠程倉庫的情況ngit branch -vvnn關聯遠程分支n關聯之後,git branch -vv就可以展示關聯的遠程分支名了,同時推送到遠程倉庫直接:git push,不需要指定遠程倉庫了。ngit branch -u origin/mybranchnn或者在push時加上-u參數ngit push origin/mybranch -unn列出所有本地分支n-l參數相當於:localngit branch -lnn列出所有遠程分支n-r參數相當於:remotengit branch -rnn列出本地和遠程分支n-a參數相當於:allngit branch -ann創建並切換到本地分支ngit checkout -b <branch-name>nn創建並切換到遠程分支ngit checkout -b <branch-name> -t origin/<branch-name>nn刪除本地分支ngit branch -d <local-branchname>nn刪除遠程分支ngit push origin --delete <remote-branchname>n或者ngit push origin :<remote-branchname>nn重命名本地分支ngit branch -m <new-branch-name>ngit branch -m <oldbranchname> <newbranchname>:嘗試修改ngit branch -M <oldbranchname> <newbranchname>:強制修改nn查看標籤ngit tagnn展示當前分支的最近的tagngit describe --tags --abbrev=0nn本地創建標籤ngit tag <version-number>nn默認tag是打在最近的一次commit上,如果需要指定commit打tag:n$ git tag -a <version-number> -m "v1.0 發布(描述)" <commit-id>nn推送標籤到遠程倉庫n首先要保證本地創建好了標籤才可以推送標籤到遠程倉庫:ngit push origin <local-version-number>nn一次性推送所有標籤,同步到遠程倉庫:ngit push origin --tagsnn刪除本地標籤ngit tag -d <tag-name>nn刪除遠程標籤n刪除遠程標籤需要先刪除本地標籤,再執行下面的命令:ngit push origin :refs/tags/<tag-name>nn切回到某個標籤n一般上線之前都會打tag,就是為了防止上線後出現問題,方便快速回退到上一版本。下面的命令是回到某一標籤下的狀態:ngit checkout -b branch_name tag_namenn放棄工作區的修改ngit checkout <file-name>nn放棄所有修改:ngit checkout .nn恢復刪除的文件ngit rev-list -n 1 HEAD -- <file_path> #得到 deleting_commitngit checkout <deleting_commit>^ -- <file_path> #回到刪除文件 deleting_commit 之前的狀態nn回到某一個commit的狀態,並重新增添一個commit //回退,有記錄ngit revert <commit-id>nn回到某個commit的狀態,並刪除後面的commitn和revert的區別:reset命令會抹去某個commit id之後的所有commitngit reset <commit-id>nn修改上一個commit的描述ngit commit --amendnn查看commit歷史ngit lognn查看某段代碼是誰寫的nblame的意思為『責怪』,你懂的。ngit blame <file-name>nn顯示本地執行過git命令n就像shell的history一樣ngit reflognn修改作者名ngit commit --amend --author=Author Name <email@address.com>nn修改遠程倉庫的urlngit remote set-url origin <URL>nn增加遠程倉庫ngit remote add origin <remote-url>nn列出所有遠程倉庫ngit remote // git remote -vnn查看兩個星期內的改動ngit whatchanged --since=2 weeks agonn把A分支的某一個commit,放到B分支上n這個過程需要cherry-pick命令,參考ngit checkout <branch-name> && git cherry-pick <commit-id>nn給git命令起別名n簡化命令ngit config --global alias.<handle> <command>n比如:git status 改成 git st,這樣可以簡化命令ngit config --global alias.st statusnn存儲當前的修改,但不用提交commitn詳解可以參考廖雪峰老師的git教程nngit stashn保存當前狀態,包括untracked的文件nnuntracked文件:新建的文件ngit stash -unn展示所有stashesngit stash listnn回到某個stash的狀態ngit stash apply <stash@{n}>nn回到最後一個stash的狀態,並刪除這個stashngit stash popnn刪除所有的stashngit stash clearnn從stash中拿出某個文件的修改ngit checkout <stash@{n}> -- <file-path>nn展示所有tracked的文件ngit ls-files -tnn展示所有untracked的文件ngit ls-files --othersnn展示所有忽略的文件ngit ls-files --others -i --exclude-standardnn強制刪除untracked的文件n可以用來刪除新建的文件。如果不指定文件文件名,則清空所有工作的untracked文件。clean命令,注意兩點:nclean後,刪除的文件無法找回n不會影響tracked的文件的改動,只會刪除untracked的文件git clean <file-name> -fn強制刪除untracked的目錄n可以用來刪除新建的目錄,注意:這個命令也可以用來刪除untracked的文件。詳情見上一條ngit clean <directory-name> -dfnn展示簡化的commit歷史ngit log --pretty=oneline --graph --decorate --alln把某一個分支到導出成一個文件ngit bundle create <file> <branch-name>n從包中導入分支n新建一個分支,分支內容就是上面git bundle create命令導出的內容ngit clone repo.bundle <repo-dir> -b <branch-name>n執行rebase之前自動stashngit rebase --autostashn從遠程倉庫根據ID,拉下某一狀態,到本地分支ngit fetch origin pull/<id>/head:<branch-name>n詳細展示一行中的修改ngit diff --word-diffn清除gitignore文件中記錄的文件ngit clean -X -fn展示所有alias和configsn注意: config分為:當前目錄(local)和全局(golbal)的config,默認為當前目錄的configngit config --local --list (當前目錄)ngit config --global --list (全局)n展示忽略的文件ngit status --ignoredncommit歷史中顯示Branch1有的,但是Branch2沒有commitngit log Branch1 ^Branch2n在commit log中顯示GPG簽名ngit log --show-signaturen刪除全局設置ngit config --global --unset <entry-name>n新建並切換到新分支上,同時這個分支沒有任何commitn相當於保存修改,但是重寫commit歷史ngit checkout --orphan <branch-name>n展示任意分支某一文件的內容ngit show <branch-name>:<file-name>nclone下來指定的單一分支ngit clone -b <branch-name> --single-branch https://github.com/user/repo.gitn忽略某個文件的改動n關閉 track 指定文件的改動,也就是 Git 將不會在記錄這個文件的改動ngit update-index --assume-unchanged path/to/filenn恢復 track 指定文件的改動ngit update-index --no-assume-unchanged path/to/filenn忽略文件的許可權變化n不再將文件的許可權變化視作改動ngit config core.fileMode falsen展示本地所有的分支的commitn最新的放在最上面ngit for-each-ref --sort=-committerdate --format=%(refname:short) refs/heads/n在commit log中查找相關內容n通過grep查找,given-text:所需要查找的欄位ngit log --all --grep=<given-text>n把暫存區的指定file放到工作區中ngit reset <file-name>nn強制推送ngit push -f <remote-name> <branch-name>列出所有遠程分支n-r參數相當於:remotengit branch -rnn更新到本地n# 源 + 分支名ngit pull origin mastern

初始化本地git倉庫(創建新倉庫)

git init n# 初始化 git 項目ngit initn安裝好 Git 之後,配置你的資料:n# 配置用戶名ngit config --global user.name "Your Real Name"n# 配置郵箱地址ngit config --global user.email you@email.addressn

配置用戶名

git config --global user.name "xxx" n

配置郵件

git config --global user.email "xxx@xxx.com" n

git status等命令自動著色

git config --global color.ui true ngit config --global color.status autongit config --global color.diff autongit config --global color.branch autongit config --global color.interactive auton

clone遠程倉庫

git clone git+ssh://git@192.168.53.168/VT.git n

查看當前版本狀態(是否修改)

git status n

添加xyz文件至index

git add xyz n

增加當前子目錄下所有更改過的文件至index

git add . n

提交

git commit -m xxx n

合併上一次提交(用於反覆修改)

git commit --amend -m xxx n

將add和commit合為一步

git commit -am xxx n

刪除index中的文件

git rm xxx n

遞歸刪除

git rm -r * n

顯示提交日誌

git log n

顯示1行日誌 -n為n行

git log -1 n

git log -5

顯示提交日誌及相關變動文件

git log --stat n

git log -p -m

顯示某個提交的詳細內容

git show dfb02e6e4f2f7b573337763e5c0013802e392818 n

可只用commitid的前幾位

git show dfb02 n

顯示HEAD提交日誌

git show HEAD n

顯示HEAD的父(上一個版本)的提交日誌 ^^為上兩個版本 ^5為上5個版本

git show HEAD^ n

顯示已存在的tag

git tag n

增加v2.0的tag

git tag -a v2.0 -m xxx n

顯示v2.0的日誌及詳細內容

git show v2.0 n

顯示v2.0的日誌

git log v2.0 n

顯示所有未添加至index的變更

git diff n

顯示所有已添加index但還未commit的變更

git diff --cached n

比較與上一個版本的差異

git diff HEAD^ n

比較與HEAD版本lib目錄的差異

git diff HEAD -- ./lib n

比較遠程分支master上有本地分支master上沒有的

git diff origin/master..master n

只顯示差異的文件,不顯示具體內容

git diff origin/master..master --stat n

增加遠程定義(用於push/pull/fetch)

git remote add origin git+ssh://git@192.168.53.168/VT.git n

顯示本地分支

git branch n

顯示包含提交50089的分支

git branch --contains 50089 n

顯示所有分支

git branch -a n

顯示所有原創分支

git branch -r n

顯示所有已合併到當前分支的分支

git branch --merged n

顯示所有未合併到當前分支的分支

git branch --no-merged n

本地分支改名

git branch -m master master_copy n

從當前分支創建新分支master_copy並檢出

git checkout -b master_copy n

上面的完整版

git checkout -b master master_copy n

檢出已存在的features/performance分支

git checkout features/performance n

檢出遠程分支hotfixes/BJVEP933並創建本地跟蹤分支

git checkout --track hotfixes/BJVEP933 n

檢出版本v2.0

git checkout v2.0 n

從遠程分支develop創建新本地分支devel並檢出

git checkout -b devel origin/develop n

檢出head版本的README文件(可用於修改錯誤回退)

git checkout -- README n

合併遠程master分支至當前分支

git merge origin/master n

合併提交ff44785404a8e的修改

git cherry-pick ff44785404a8e n

將當前分支push到遠程master分支

git push origin master n

刪除遠程倉庫的hotfixes/BJVEP933分支

git push origin :hotfixes/BJVEP933 n

把所有tag推送到遠程倉庫

git push --tags n

獲取所有遠程分支(不更新本地分支,另需merge)

git fetch n

獲取所有原創分支並清除伺服器上已刪掉的分支

git fetch --prune n

獲取遠程分支master並merge到當前分支

git pull origin master n

重命名文件README為README2

git mv README README2 n

將當前版本重置為HEAD(通常用於merge失敗回退)

git reset --hard HEAD n

git rebase

刪除分支hotfixes/BJVEP933(本分支修改已合併到其他分支)

git branch -d hotfixes/BJVEP933 n

強制刪除分支hotfixes/BJVEP933

git branch -D hotfixes/BJVEP933 n

列出git index包含的文件

git ls-files n

圖示當前分支歷史

git show-branch n

圖示所有分支歷史

git show-branch --all n

顯示提交歷史對應的文件修改

git whatchanged n

撤銷提交dfb02e6e4f2f7b573337763e5c0013802e392818

git revert dfb02e6e4f2f7b573337763e5c0013802e392818 n

內部命令:顯示某個git對象

git ls-tree HEAD n

內部命令:顯示某個ref對於的SHA1 HASH

git rev-parse v2.0 n

顯示所有提交,包括孤立節點

git reflog n

git show HEAD@{5}

顯示master分支昨天的狀態

git show master@{yesterday} n

圖示提交日誌

git log --pretty=format:%h %s --graph ngit show HEAD~3ngit show -s --pretty=raw 2be7fcb476n

暫存當前修改,將所有至為HEAD狀態

git stash n

查看所有暫存

git stash list n

參考第一次暫存

git stash show -p stash@{0} n

應用第一次暫存

git stash apply stash@{0} n

文件中搜索文本「delete from」

git grep "delete from" ngit grep -e #define --and -e SORT_DIRENTnngit gcngit fsckn

推薦閱讀:

和一群不用Git的同事寫代碼是一種什麼體驗?
git中有的命令參數為什麼使用一個橫杠 - 有的命令卻使用兩個橫杠 -- ?
代碼寫得好,但是不會(不願)使用 Git 之類的代碼管理工具能稱得上是優秀程序員嗎?

TAG:Git |