1.安裝Git
Linux
sudo apt-get install git
Windows
下載安裝程序茸苇,(網(wǎng)速慢的同學請移步國內(nèi)鏡像)
安裝完成后箭阶,在開始菜單里找到“Git”->“Git Bash”殊轴,蹦出一個類似命令行窗口的東西,就說明Git安裝成功砖茸!
還需要最后一步設(shè)置,在命令行輸入自報家門:
git config --global user.name "dingto"
git config --global user.email "2524370217@"
2.Git和其他版本控制系統(tǒng)如SVN的一個不同之處就是有暫存區(qū)的概念。
Git管理的是修改曙搬,而不是文件
工作區(qū)(Working Directory)
就是你在電腦里能看到的目錄,比如我的learngit文件夾就是一個工作區(qū):
版本庫(Repository)
工作區(qū)有一個隱藏目錄.git媒怯,這個不算工作區(qū)订讼,而是Git的版本庫。
Git的版本庫里存了很多東西扇苞,其中最重要的就是稱為stage(或者叫index)的暫存區(qū)欺殿,
還有Git為我們自動創(chuàng)建的第一個分支master,以及指向master的一個指針叫HEAD
3.創(chuàng)建一個版本庫
git init xx
4.添加文件到Git倉庫:
第一步是用git add把文件添加進去鳖敷,實際上就是把文件修改添加到暫存區(qū)
git add xx
/ git add .
第二步是用git commit提交更改脖苏,實際上就是把暫存區(qū)的所有內(nèi)容提交到當前分支
git commit -m "xx"
5.隨時掌握工作區(qū)的狀態(tài),使用git status命令定踱。
如果git status
告訴你有文件被修改過棍潘,
用git diff
未commit前可看修改內(nèi)容。
6.在版本的歷史之間穿梭崖媚,
- 穿梭前亦歉,用
git log
可以查看提交歷史,以便確定要回退到哪個版本畅哑。 - 要重返未來肴楷,用
git reflog
查看命令歷史,以便確定要回到未來的哪個版本
如果嫌輸出信息太多荠呐,加上--pretty=oneline
git log --graph --pretty=oneline --abbrev-commit
git reset --hard HEAD^
HEAD指向的版本就是當前版本赛蔫。上一個版本就是HEAD^,上上一個版本就是HEAD^^泥张,當然往上100個版本寫100個^比較容易數(shù)不過來呵恢,所以寫成HEAD~100。
git reset --hard commit_id
穿梭
7.直接丟棄工作區(qū)的修改
git checkout -- file
當你不但改亂了工作區(qū)某個文件的內(nèi)容圾结,還添加到了暫存區(qū)時瑰剃,想丟棄修改,分兩步
第一步用命令git reset HEAD <file>
筝野,就回到了場景1晌姚,
第二步按場景1操作粤剧。 已經(jīng)提交了不合適的修改到版本庫時,想要撤銷本次提交挥唠,參考版本回退一節(jié)抵恋,不過前提是沒有推送到遠程庫。
從版本庫中刪除該文件
用命令git rm
刪掉宝磨,并且git commit
另一種情況是刪錯了弧关,因為版本庫里還有
git checkout filename
其實是用版本庫里的版本替換工作區(qū)的版本,無論工作區(qū)是修改還是刪除唤锉,都可以“一鍵還原”世囊。
8.本地Git倉庫和GitHub倉庫
第1步:創(chuàng)建SSH Key:
ssh-keygen -t rsa -C "2524370217@qq.com"
在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個文件窿祥,這兩個就是SSH Key的秘鑰對株憾,id_rsa是私鑰,不能泄露出去晒衩,id_rsa.pub是公鑰嗤瞎,可以放心地告訴任何人。
第2步:登陸GitHub听系,打開“Account settings”贝奇,“SSH Keys”頁面:
然后,點“Add SSH Key”靠胜,填上任意Title掉瞳,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容:
首先,登陸GitHub髓帽,然后菠赚,在右上角找到“Create a new repo”按鈕,創(chuàng)建一個新的倉庫:
在本地關(guān)聯(lián)的就是我的遠程庫git remote add origin git@github.com:git名/庫名.git
把本地庫的所有內(nèi)容推送到遠程庫上: git push -u origin master
由于遠程庫是空的郑藏,我們第一次推送master分支時衡查,加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠程新的master分支必盖,還會把本地的master分支和遠程的master分支關(guān)聯(lián)起來拌牲,在以后的推送或者拉取時就可以簡化命令。
從現(xiàn)在起歌粥,只要本地作了提交塌忽,就可以通過命令:git push origin master
同步到遠程倉庫
取消本地目錄下關(guān)聯(lián)的遠程庫:git remote remove origin
git init
git add .
git commit -m "My first commit operation"
# 添加遠程倉庫地址,保存在origin變量中
git remote add origin git@github.com:tomding/888.git
# 用命令git clone克隆一個本地庫:
git clone git@github.com:git名/庫名.git
# 按照前一條命令中origin給定的github地址推送到github倉庫的master分支
git push origin master
9.分支管理
查看分支:git branch
創(chuàng)建分支:git branch 分支名
切換分支:git checkout 分支名
創(chuàng)建+切換分支:git checkout -b 分支名
合并某分支到當前分支:git merge --no-ff -m "merge with no-ff" dev
git merge 分支名
刪除分支:git branch -d 分支名
如果要丟棄一個沒有被合并過的分支失驶,可以通過git branch -D <name>強行刪除土居。
當Git無法自動合并分支
必須首先解決沖突。解決沖突后,再提交擦耀,合并完成棉圈。
解決沖突就是把Git合并失敗的文件手動編輯為我們希望的內(nèi)容,再提交眷蜓。
用git log --graph
命令可以看到分支合并圖分瘾。
10.把當前工作現(xiàn)場“儲藏”起來,等以后恢復(fù)現(xiàn)場后繼續(xù)工作
git stash
git stash list
看剛才的工作現(xiàn)場
工作現(xiàn)場還在吁系,Git把stash內(nèi)容存在某個地方了德召,但是需要恢復(fù)一下,有兩個辦法:
一是用git stash apply恢復(fù)汽纤,但是恢復(fù)后上岗,stash內(nèi)容并不刪除,你需要用git stash drop來刪除蕴坪; 另一種方式是用git stash pop液茎,恢復(fù)的同時把stash內(nèi)容也刪了
你可以多次stash,恢復(fù)的時候辞嗡,先用git stash list查看,然后恢復(fù)指定的stash滞造,用命令:git stash apply stash@{0}
修復(fù)bug時续室,我們會通過創(chuàng)建新的bug分支進行修復(fù),然后合并谒养,最后刪除挺狰;
當手頭工作沒有完成時,先把工作現(xiàn)場git stash一下买窟,然后去修復(fù)bug丰泊,修復(fù)后,再git stash pop始绍,回到工作現(xiàn)場瞳购。
推送分支
當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應(yīng)起來了亏推,并且学赛,遠程倉庫的默認名稱是origin。
查看遠程庫的信息吞杭,git remote -v
推送時盏浇,要指定本地分支,這樣芽狗,Git就會把該分支推送到遠程庫對應(yīng)的遠程分支上:git push origin master
多人協(xié)作的工作模式通常是這樣
現(xiàn)在我們的小伙伴要在dev分支上做開發(fā)绢掰,就必須把遠程的origin的dev分支到本地來,于是可以使用命令創(chuàng)建本地dev分支:
git checkout –b dev origin/dev
推送: git push origin dev
如果推送失敗,則因為遠程分支比你的本地更新滴劲,需要先用git pull
試圖合并攻晒;
如果合并有沖突,則解決沖突哑芹,并在本地提交炎辨; 沒有沖突或者解決掉沖突后,再用push推送就能成功聪姿!
如果git pull提示no tracking information碴萧,則說明本地分支和遠程分支的鏈接關(guān)系沒有創(chuàng)建,用命令git branch --set-upstream-to=origin/dev dev
rebase把本地未push的分叉提交歷史整理成直線末购;
rebase之前需要經(jīng)master分支拉到最新
切換分支到需要rebase的分支破喻,這里是dev分支
git rebase 后再git merge
執(zhí)行g(shù)it rebase master,有沖突就解決沖突盟榴,解決后直接git add . 再git - rebase --continue即可
打標簽
首先曹质,切換到需要打標簽的分支上,敲命令git tag <name>
就可以打一個新標簽
查看所有標簽:git tag
默認標簽是打在最新提交的commit上的。有時候擎场,如果忘了找到歷史提交的commit id羽德,然后打上就可以了:git tag v0.9 f52c633
注意,標簽不是按時間順序列出迅办,而是按字母排序的宅静。可以用git show <tagname>
查看標簽信息:
創(chuàng)建帶有說明的標簽:git tag -a v0.1 -m "version 0.1 released" 1094adb
注意:標簽總是和某個commit掛鉤站欺。如果這個commit既出現(xiàn)在master分支姨夹,又出現(xiàn)在dev分支,那么在這兩個分支上都可以看到這個標簽矾策。
如果標簽打錯了磷账,也可以刪除:git tag -d v0.1
因為創(chuàng)建的標簽都只存儲在本地,不會自動推送到遠程贾虽。所以逃糟,打錯的標簽可以在本地安全刪除。
如果要推送某個標簽到遠程蓬豁,使用命令git push origin <tagname>
或者履磨,一次性推送全部尚未推送到遠程的本地標簽:git push origin --tags
如果標簽已經(jīng)推送到遠程,要刪除遠程標簽就麻煩一點庆尘,先從本地刪除:git tag -d v0.9
然后剃诅,從遠程刪除。刪除命令也是push驶忌,但是格式如下:git push origin :refs/tags/v0.9
要看看是否真的從遠程庫刪除了標簽矛辕,可以登陸GitHub查看笑跛。
忽略文件
touch .gitignore
不需要從頭寫.gitignore文件,GitHub已經(jīng)為我們準備了各種配置文件聊品,只需要組合一下就可以使用了。所有配置文件可以直接在線瀏覽:https://github.com/github/gitignore
.gitignore
只能忽略那些原來沒有被track的文件翻屈,如果某些文件已經(jīng)被納入了版本管理中,則修改.gitignore是無效的伸眶。所以一定要養(yǎng)成在項目開始就創(chuàng)建.gitignore文件的習慣惊窖。
刪除track的文件 (已經(jīng)commit的文件)
git rm 要忽略的文件
git commit -a -m "刪除不需要的文件"
在.gitignore文件中添加忽略規(guī)則
有些時候界酒,你想添加一個文件到Git,但發(fā)現(xiàn)添加不了毁欣,原因是這個文件被.gitignore忽略了:可以用-f強制添加到Git:git add -f App.class
或者你發(fā)現(xiàn),可能是.gitignore寫得有問題岳掐,需要找出來到底哪個規(guī)則寫錯了,可以用git check-ignore命令檢查:
git check-ignore -v App.class
.gitignore:3:*.class App.class
Git會告訴我們串述,.gitignore的第3行規(guī)則忽略了該文件哭尝,于是我們就可以知道應(yīng)該修訂哪個規(guī)則。
glob模式
所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式剖煌,匹配規(guī)則如下:
"*":星號匹配零個或多個任意字符
[]:匹配任何一個列在方括號中的字符,如[ab]匹配a或者匹配b
"?":問號匹配一個任意字符
[n-m]:匹配所有在這兩個字符范圍內(nèi)的字符逝淹,如[0-9]表示匹配所有0到9的數(shù)字
匹配示例
logs/:忽略當前路徑下的logs目錄耕姊,包含logs下的所有子目錄和文件
/logs.txt:忽略根目錄下的logs.txt文件
*.class:忽略所有后綴為.class的文件
!/classes/a.class:不忽略classes目錄下的a.class文件
tmp/*.txt:只忽略tmp目錄下的.txt文件
**/foo:可以忽略/foo, a/foo, a/b/foo等
命令簡寫
很多人都用co表示checkout,ci表示commit栅葡,br表示branch:
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
--global參數(shù)是全局參數(shù)茉兰,也就是這些命令在這臺電腦的所有Git倉庫下都有用。
我們知道欣簇,命令git reset HEAD file可以把暫存區(qū)的修改撤銷掉(unstage)规脸,重新放回工作區(qū)。既然是一個unstage操作熊咽,就可以配置一個unstage別名:git config --global alias.unstage 'reset HEAD'
配置一個git last莫鸭,讓其顯示最后一次提交信息:git config --global alias.last 'log -1'
甚至還有人喪心病狂地把lg配置成了:git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
而當前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig中:
cat .gitconfig
[alias]
co = checkout ci = commit br = branch st = status [user] name = Your Name email = your@email.com
配置別名也可以直接修改這個文件,如果改錯了横殴,可以刪掉文件重新通過命令配置被因。
搭建一臺Git服務(wù)器作為私有倉庫使用。
推薦用Ubuntu或Debian,這樣梨与,通過幾條簡單的apt命令就可以完成安裝堕花。假設(shè)你已經(jīng)有sudo權(quán)限的用戶賬號,下面粥鞋,正式開始安裝缘挽。
第一步,安裝git:
````sudo apt-get install git第二步呻粹,創(chuàng)建一個git用戶壕曼,用來運行g(shù)it服務(wù):
sudo adduser git第三步,創(chuàng)建證書登錄: 收集所有需要登錄的用戶的公鑰尚猿,就是他們自己的id_rsa.pub文件窝稿,把所有公鑰導(dǎo)入到/home/git/.ssh/authorized_keys文件里,一行一個凿掂。 第四步伴榔,初始化Git倉庫: 先選定一個目錄作為Git倉庫,假定是/srv/sample.git踪少,在/srv目錄下輸入命令:
sudo git init --bare sample.gitGit就會創(chuàng)建一個裸倉庫援奢,裸倉庫沒有工作區(qū)集漾,因為服務(wù)器上的Git倉庫純粹是為了共享具篇,所以不讓用戶直接登錄到服務(wù)器上去改工作區(qū)驱显,并且服務(wù)器上的Git倉庫通常都以.git結(jié)尾埃疫。然后栓霜,把owner改為git:
sudo chown -R git:git sample.git第五步,禁用shell登錄: 出于安全考慮叙淌,第二步創(chuàng)建的git用戶不允許登錄shell闻鉴,這可以通過編輯/etc/passwd文件完成孟岛。找到類似下面的一行: git:x:1001:1001:,,,:/home/git:/bin/bash 改為: git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell 這樣渠羞,git用戶可以正常通過ssh使用git次询,但無法登錄shell屯吊,因為我們?yōu)間it用戶指定的git-shell每次一登錄就自動退出盒卸。 第六步蔽介,克隆遠程倉庫: 現(xiàn)在虹蓄,可以通過git clone命令克隆遠程倉庫了薇组,在各自的電腦上運行:
git clone git@server:/srv/sample.git Cloning into 'sample'... warning: You appear to have cloned an empty repository.```
剩下的推送就簡單了。
管理公鑰
如果團隊很小挑童,把每個人的公鑰收集起來放到服務(wù)器的/home/git/.ssh/authorized_keys文件里就是可行的站叼。如果團隊有幾百號人尽楔,就沒法這么玩了,這時玛荞,可以用Gitosis來管理公鑰勋眯。
這里我們不介紹怎么玩Gitosis了客蹋,幾百號人的團隊基本都在500強了讶坯,相信找個高水平的Linux管理員問題不大辆琅。
管理權(quán)限
有很多不但視源代碼如生命涎跨,而且視員工為竊賊的公司隅很,會在版本控制系統(tǒng)里設(shè)置一套完善的權(quán)限控制率碾,每個人是否有讀寫權(quán)限會精確到每個分支甚至每個目錄下所宰。因為Git是為Linux源代碼托管而開發(fā)的仔粥,所以Git也繼承了開源社區(qū)的精神躯泰,不支持權(quán)限控制麦向。不過诵竭,因為Git支持鉤子(hook),所以沙郭,可以在服務(wù)器端編寫一系列腳本來控制提交等操作棠绘,達到權(quán)限控制的目的氧苍。Gitolite就是這個工具让虐。
這里我們也不介紹Gitolite了赡突,不要把有限的生命浪費到權(quán)限斗爭中惭缰。
小結(jié)
搭建Git服務(wù)器非常簡單漱受,通常10分鐘即可完成;
要方便管理公鑰絮记,用Gitosis怨愤;
要像SVN那樣變態(tài)地控制權(quán)限撰洗,用Gitolite
如何參與一個開源項目呢差导?比如人氣極高的bootstrap項目柿汛,這是一個非常強大的CSS框架络断,你可以訪問它的項目主頁https://github.com/twbs/bootstrap项玛,點“Fork”就在自己的賬號下克隆了一個bootstrap倉庫襟沮,然后开伏,從自己的賬號下clone:
git clone git@github.com:michaelliao/bootstrap.git
一定要從自己的賬號下clone倉庫固灵,這樣你才能推送修改。如果從bootstrap的作者的倉庫地址git@github.com:twbs/bootstrap.git克隆丛忆,因為沒有權(quán)限熄诡,你將不能推送修改凰浮。
如果你想修復(fù)bootstrap的一個bug姜骡,或者新增一個功能,立刻就可以開始干活惫周,干完后康栈,往自己的倉庫推送啥么。
如果你希望bootstrap的官方庫能接受你的修改菠秒,你就可以在GitHub上發(fā)起一個pull request践叠。當然管挟,對方是否接受你的pull request就不一定了弄捕。
如果你沒能力修改bootstrap守谓,但又想要試一把pull request斋荞,那就Fork一下我的倉庫:https://github.com/michaelliao/learngit譬猫,創(chuàng)建一個your-github-id.txt的文本文件,寫點自己學習Git的心得别洪,然后推送一個pull request給我挖垛,我會視心情而定是否接受痢毒。
使用碼云和使用GitHub類似哪替,我們在碼云上注冊賬號并登錄后凭舶,需要先上傳自己的SSH公鑰帅霜。選擇右上角用戶頭像 -> 菜單“修改資料”身冀,然后選擇“SSH公鑰”搂根,填寫一個便于識別的標題,然后把用戶主目錄下的.ssh/id_rsa.pub文件的內(nèi)容粘貼進去: 如果我們已經(jīng)有了一個本地的git倉庫(例如,一個名為learngit的本地庫)隙咸,如何把它關(guān)聯(lián)到碼云的遠程庫上呢五督? 首先瓶殃,我們在碼云上創(chuàng)建一個新的項目遥椿,選擇右上角用戶頭像 -> 菜單“控制面板”冠场,然后點擊“創(chuàng)建項目”: 項目名稱最好與本地庫保持一致:
然后碴裙,我們在本地庫上使用命令git remote add把它和碼云的遠程庫關(guān)聯(lián):git remote add origin git@gitee.com:liaoxuefeng/learngit.git
之后舔株,就可以正常地用git push和git pull推送了载慈!
如果在使用命令git remote add時報錯:git remote add origin git@gitee.com:liaoxuefeng/learngit.git fatal: remote origin already exists.
這說明本地庫已經(jīng)關(guān)聯(lián)了一個名叫origin的遠程庫办铡,此時料扰,可以先用git remote -v查看遠程庫信息:
git remote -v 可以看到嫂伞,本地庫已經(jīng)關(guān)聯(lián)了origin的遠程庫,并且撰豺,該遠程庫指向GitHub污桦。
我們可以刪除已有的GitHub遠程庫:git remote rm origin
再關(guān)聯(lián)碼云的遠程庫(注意路徑中需要填寫正確的用戶名):git remote add origin git@gitee.com:liaoxuefeng/learngit.git
現(xiàn)在可以看到,origin已經(jīng)被關(guān)聯(lián)到碼云的遠程庫了亭姥。通過git push命令就可以把本地庫推送到Gitee上坝撑。
因為git本身是分布式版本控制系統(tǒng)粮揉,可以同步到另外一個遠程庫击儡,當然也可以同步到另外兩個遠程庫。
使用多個遠程庫時阳谍,我們要注意,git給遠程庫起的默認名稱是origin训貌,如果有多個遠程庫递沪,我們需要用不同的名稱來標識不同的遠程庫款慨。
仍然以learngit本地庫為例檩奠,我們先刪除已關(guān)聯(lián)的名為origin的遠程庫:git remote rm origin
然后埠戳,先關(guān)聯(lián)GitHub的遠程庫:git remote add github git@github.com:michaelliao/learngit.git
注意,遠程庫的名稱叫g(shù)ithub颗圣,不叫origin了屁使。
接著在岂,再關(guān)聯(lián)碼云的遠程庫:git remote add gitee git@gitee.com:liaoxuefeng/learngit.git
同樣注意,遠程庫的名稱叫g(shù)itee屋灌,不叫origin。
現(xiàn)在应狱,我們用git remote -v查看遠程庫信息共郭,可以看到兩個遠程庫:
如果要推送到GitHub,使用命令:git push github master
如果要推送到碼云疾呻,使用命令:git push gitee master
碼云也同樣提供了Pull request功能除嘹,可以讓其他小伙伴參與到開源項目中來。你可以通過Fork我的倉庫:https://gitee.com/liaoxuefeng/learngit岸蜗,創(chuàng)建一個your-gitee-id.txt的文本文件,
寫點自己學習Git的心得,然后推送一個pull request給我,這個倉庫會在碼云和GitHub做雙向同步扒腕。
git錯誤:unable to auto-detect email address
找到工程目錄 (Project) 的.git文件夾居灯,打開之后找到config文件,在最后邊加上一句話
[user]
email=your email
name=your name
顯示當前的git配置 git config --list
編輯git配置文件 git config -e [--global]
提交暫存區(qū)的指定文件到倉庫區(qū) git commit [file] -m”message”
提交工作區(qū)自上次commit之后的變化,直接到倉庫區(qū) git commit -a
提交時顯示所有diff信息 git commit -v
使用一次新的commit,代替上一次提交如果代碼沒有變化則用來改寫上一次commit的提交信息 git commit --amend -m”message”
重做上一次commit,包括指定文件的新變化 git commit --amend [file]
顯示所有本地分支 git branch
列出所有遠程分支 git branch -r
列出所有本地分支和遠程分支 git branch -a
新建一個分支,但依然停留就在當前分支 git branch [branch-name]
新建一個分支,與指定的遠程分支建立追蹤關(guān)系 git branch --track [branch] [remote-branch]
刪除分支 git branch -d [branch-name]
刪除遠程分支 git push origin --delete [branch]
Git branch -dr [remote/branch]
新建一個分支并切換到該分支 git checkout -b [branch]
切換到指定分支并更新工作區(qū) git checkout [branch-name]
切換到上一個分支git checkout -
在現(xiàn)有分支與指定分支之間建立追蹤關(guān)系 git branch --set-upstream [branch] [remote-branch]
合并制定分支到當前分支 git merge [branch]
衍合指定分支到當前分支 git rebase [branch]
選擇一個commit,合并進當前分支 git cheery-pick [commit]
列出所有本地標簽 git tag
基于最新提交創(chuàng)建標簽 git tag [tagname]
刪除標簽 git tag -d [tagname]
刪除遠程標簽 git push origin :refs/tags/tagname
查看標簽信息 git show [tagname]
提交指定標簽 git push [remote] [tag]
提交所有標簽 git push [remote] --tags
新建一個分支,指向某個標簽 git checkout -b [branchname] [tagname]
顯示有變更的文件 git status
顯示當前分支的版本歷史 git log
顯示commit歷史,以及每次commit發(fā)生變更的文件 git log --stat
根據(jù)關(guān)鍵詞搜索提交歷史 git log -s keyword
顯示某個提交后的所有變動,每個提交占據(jù)一行 git log tagname HEAD --pretty=format:%s
顯示某個提交之后的所有變動,其提交說明必須符合搜索條件 git log tagname HEAD --grep feature
顯示某個文件的版本歷史,包括文件改名 git log --follow filename
Git whatchanged filename
顯示指定文件相關(guān)的每一次diff git log -p filename
顯示過去5次提交 git log -5 --pretty --oneline
顯示所有提交過的用戶,按提交次數(shù)排序 git shortlog -sn
顯示指定文件是什么人在什么時間修改過 git blame filename
顯示暫存區(qū)和工作區(qū)的差異 git diff
顯示暫存區(qū)和上一個提交的差異 git diff --cached filename
顯示兩次提交之間的差異 git diff firstbranch secondbranch
顯示工作區(qū)與當前分支最新提交之間的差異 git diff HEAD
顯示今天你寫了多少行代碼 git diff --shortstat “@{0 day ago}”
顯示某次提交的元數(shù)據(jù)和內(nèi)容變化 git show commitid
顯示某次提交發(fā)生變化的文件 git show --name-only commitid
顯示某次提交時,某個文件的內(nèi)容 git show commitid:filename
顯示當前分支的最近幾次提交 git reflog
下載遠程倉庫的所有變動 git fetch [remote]
取回遠程倉庫的變化,并與本地分支合并 git pull [remote] [branch]
顯示所有遠程倉庫 git remote -v
顯示某個遠程倉庫的信息 git remote show [remote]
增加一個新的遠程倉庫并命名 git remote add [shortname] [url]
上傳本地指定分支到遠程倉庫 git push [remote] [branch]
強行推送當前分支到遠程倉庫,即使有沖突 git push [remote] --force
推送所有分支到遠程倉庫 git push [remote] --all
刪除遠程分支或標簽 git push [remote] :branchname/tagname
上傳所有標簽 git push --tags
撤銷工作目錄中所有未提交文件的修改內(nèi)容 git reset --hard HEAD
撤銷指定的未提交文件的修改內(nèi)容 git checkout HEAD filename
撤銷指定的提交 git revert commitid
退回到一天之前的版本 git log --before=”1 days”
恢復(fù)暫存區(qū)的指定文件到工作區(qū) git checkout filename
恢復(fù)某個提交的指定文件到暫存區(qū)和工作區(qū) git checkout commitid filename
恢復(fù)暫存區(qū)的所有文件到工作區(qū) git checkout .
重置暫存區(qū)的指定文件,與上一次提交保持一致,但工作區(qū)不變 git reset filename
重置暫存區(qū)與工作區(qū),與上一次提交保持一致 git reset --hard
重置當前分支的指針為指定提交,同時重置暫存區(qū),但工作區(qū)不變 git reset commitid
重置當前分支的HEAD為指定提交,同時重置暫存區(qū)和工作區(qū),與指定提交一致 git reset --hard commitid
重置當前HEAD 為指定提交,但保持暫存區(qū)和工作區(qū)不變 git reset --keep commitid
新建一個提交用來撤銷指定提交后者的所有變化都將被前者抵消,并且應(yīng)用到當前分支 git revert commitid
暫時將未提交的變化移除,稍后再移入 git stash git stash pop
生成一個可共發(fā)布的壓縮包 git archive
修改提交注釋
git commit -v --amend