git config --global user.name "Your Name" |
設置名字 |
git config --global user.email "email@example.com" |
設置郵箱 |
git commit --amend --author='Your Name <you@example.com>' |
如果名字郵箱有誤,可以修改 |
git init |
初始化1個git倉庫 |
git add |
添加文件到倉庫 |
git commit -m |
提交更改,-m為此次提交的說明(message) |
git status |
查看倉庫當前的狀態 |
git diff |
文件被修改后,查看修改的內容 |
git log |
提交的歷史版本信息(從最近到最遠羅列歷史提交的信息) |
HEAD |
表示當前版本 |
HEAD^ |
表示上1個版本 |
HEAD^^ |
表示上上個版本 |
HEAD~100 |
表示往上100個版本 |
git reset --hard HEAD^ |
回退到上個版本 |
git reset --hard 3628164 |
如果回退后希望撤消回退,可以直接在hard后面寫上最后1次提交版本的commit id,一樣重新回到最新版(條件是當前終端命令行沒有關閉) |
git reflog |
用來記錄你的每次命令,場景:關掉了終端,希望撤消這次回退,則可用來查找最新的版本的commit id |
工作區 |
就是在電腦中能看到的目錄 |
版本庫 |
工作區有1個隱藏目錄.git,這個不算工作區,而是git的版本庫: 版本庫里存了很多東西,其中最重要的就是稱為stage(或叫index)的暫存區,還有Git為我們自動創建的第1個分支master,和指向master的1個指針叫HEAD |
暫存區(stage或index)(概念重要) |
git add
實際上就是把文件的修改添加到暫存區 |
管理修改 |
git跟蹤并管理的是修改,而非文件 |
git diff HEAD -- <fiel> |
查看工作區和版本庫里面最新版本的區分 |
git checkout -- <file> |
放棄工作區的修改,把<file>文件在工作區的修改全部撤消,讓這個文件回到最近1次git commit 或 git add 時的狀態 |
git reset HEAD <file> |
把暫存區的修改撤消掉(unstage),重新放回工作區 |
git reset |
既可以回退版本,也能夠把暫存區的修改回退到工作區。當我們用HEAD時,表示最新版本 |
git rm <file> |
在版本庫中刪除某個文件,如果1個文件已被提交到版本庫,那末你永久不用擔心誤刪,但是要謹慎,你只能恢復文件到最新版本,你會丟失最近1次提交后你修改的內容 |
創建SSH Key |
$ ssh-keygen -t rsa -C "youremail@example.com" |
SSH本地文件 |
主用戶目錄>>/.ssh/id_res.pub里面的是公匙,在github新加SSH Key的時候把里面的內容復制過去 |
關聯遠程倉庫 |
$ git remote add origin git@github.com:Jiayupeng/learngit.git |
git push |
把本地庫的內容推送到遠程,實際上是把當前分支master推送到遠程 |
git push -u origin master |
加上-u參數,Git不但會把本地的master分支內容推送到遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以后的推送或拉取時就能夠簡化命令 |
git push origin master |
從現在起,只要本地做了提交,就能夠通過此命令同步到遠程倉庫 |
小結 |
|
git clone |
克隆遠程庫到本地 要有需要克隆的遠程庫的地址如:git@github.com:Jiayupeng/gitskills.git,在github倉庫頁面能找到,ssh支持的原生git協議速度最快 |
git checkout -b dev |
創建dev分支,然后切換到dev分支,git checkout 命令加上-b參數表示創建并切換,相當于以下兩條命令: |
git branch dev |
創建dev分支 |
git checkout dev |
切換到dev分支 |
git branch |
查看當前分支 |
git merge |
用于合并指定分支到當前分支,如 git merge dev |
Fast-forward |
1種合并模式,快速合并,只是改變指針的位置而已 |
小結: |
git鼓勵大量使用分支 查看分支:git branch 創建分支:git branch <name> 切換分支:git checkout <name> 創建+切換分支:git checkout -b <name> 合并某分支到當前分支:git merge <name> 刪除分支:git branch -d <name> |
git log --graph |
可以看到分支合并圖 |
$ git log --graph --pretty=oneline --abbrev-commit |
上面那個命令的擴大,多了幾個命令 |
手動解決沖突 |
如果兩個分支都對同1個文件進行了修改,合并的時候會出現沖突,這時候候需要手動解決沖突 |
--no-ff |
git merge 的禁用Fast forward模式,具體命令: |
git merge --no-ff -m"merge with no-ff" dev |
如果要強迫禁用Fast forward模式,Git就會在merge時生成1個新的commit,這樣,從分支歷史上就能夠看出分支信息 |
開發中分支策略的幾個原則 |
|
|
|
|
|
小結 |
|
git stash |
當需要修復1個bug,而dev分支的內容還沒有提交(還不能提交,功能未完成),這個命令可以把當前工作現場“蘊藏”起來,等以后恢復現場后繼續工作 |
git stash list |
存儲的stash,要恢復原來的工作現場,有兩種方法: |
git stash apply |
恢復stash,但是還需要用git stash drop來刪除 |
git stash drop |
當用git stash apply恢復stash后,需要用這個命令來刪除這個stash |
git stash pop |
恢復stash的同時,把stash的內容也刪掉 |
git stash apply stash@{0} |
可以屢次stash,恢復的時候,先用git stash list查看,然后恢復指定的stash |
小結: |
修復bug時,我們會通過創建新的bug分支進行修復,然后合并,最后刪除; |
|
當手頭工作沒有完成時,先把工作現場git stash1下,然后去修復bug,修復后,再git stash pop,回到工作現場。 |
git branch -D <branch name> |
如果要拋棄1個沒有合并的分支,用這個命令,強迫刪除1個分支 |
git remote |
當你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,并且,遠程倉庫的默許名稱是origin。 此命令,查看遠程庫的信息。 |
git remote -v |
顯示更詳細的信息,顯示了可以抓取和推送origin地址 |
git push origin master |
推送分支,就是把該分支上的所有本地提交推送到遠程庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上 |
git push origin dev |
要推送本地其他分支到遠程,就把后面的本地分支名字改成當前要推送的分支名便可 |
哪些分支需要推送? |
master和dev需要,不過bug分支只用于本地修復bug,沒推送必要,feature分支是不是推到遠程,取決于你是不是和你的小火伴合作在上面開發。 |
git checkout -b dev origin/dev |
當從遠程clone下來后,默許只有本地的master分支,如果要在dev分支上做修改,需要使用這個命令,創建遠程的origin的dev分支到本地 |
git pull |
如果其他人對一樣的文件做了修改,而自己一樣往遠程push,則會產生沖突,解決方案是先用git pull 把最新的提交從origin/dev抓下來,然后,在本地合并,解決沖突,在推送 如果pull失敗,根據git的提示,使用下面的命令: |
git branch --set-upstream-to=origin/<branch> dev |
設置dev和origin/dev的鏈接,連接后,再次pull就能夠成功了 |
git commit -m |
pull成功但是合并有沖突,以后手動解決沖突,再次commit,然后再推送到遠程origin |
多人協作的模式通常是這樣: |
|
會出現的問題及解決 |
如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關系沒有創建,用命令git branch --set-upstream branch-name origin/branch-name。 |
小結 |
|