git config
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
git config --list
注意git config命令的–global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。
基本操作
*
git init
*
git diff
*
git add <file>
*
git commit
*
git status
git diff
- git diff #是工作區(work dict)和暫存區(stage)的比較
- git diff –cached #是暫存區(stage)和分支(master)的比較
- git diff HEAD #查看工作區和版本庫裏面最新版本的區別
git diff HEAD – readme.txt
- git diff master test # 比較分支
- git diff test
如果你要查看當前的工作目錄與另外一個分支的差別
–stat 參數可以統計一下有哪些文件被改動,有多少行被改動:
commit
需要使用-m添加本次修改的註釋,完成後就會記錄一個新的項目版本。除了用git add 命令,我們還可以用下面的命令將所有沒有加到緩存區的修改也一起提交,但-a命令不會添加新建的文件。
git log
- git log
- git log –pretty=oneline
- git reflog
用來記錄你的每一次命令
- 用git log –graph命令可以看到分支合併圖。
- git log –graph –pretty=format:’%h -%d %s (%cr)’ –abbrev-commit –reflog
使用git revert <commit_id>操作實現以退爲進,
git revert 不同於 git reset 它不會擦除”回退”之後的 commit_id ,而是正常的當做一次”commit”,產生一次新的操作記錄,所以可以push,不會讓你再pull
假設一開始你的本地和遠程都是: a -> b -> c 你想把HEAD回退到b,那麼在本地就變成了: a -> b 這個時候,如果沒有遠程庫,你就接着怎麼操作都行,比如: a -> b -> d 但是在有遠程庫的情況下,你push會失敗,因爲遠程庫是 a->b->c,你的是 a->b->d 兩種方案: push的時候用--force,強制把遠程庫變成a -> b -> d,大部分公司嚴禁這麼幹,會被別人揍一頓 做一個反向操作,把自己本地變成a -> b -> c -> d,注意b和d文件快照內容一莫一樣,但是commit id肯定不同,再push上去遠程也會變成 a -> b -> c -> d 簡單地說就是你無法容易地抹去遠程庫的提交信息,所以本地提交怎麼都行,push前想好了
git reset
- git reset –hard HEAD~
- git reset –hard HEAD~100
- git reset –hard 3628164
commit id(版本號)沒必要寫全
撤銷修改
- 場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout – file。
- 場景2:當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
- 場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。
git checkout
- git checkout HEAD~ files
checkout命令用於從歷史提交(或者暫存區域)中拷貝文件到工作目錄,也可用於切換分支。當給定某個文件名時,git會從指定的提交中拷貝文件到暫存區域和工作目錄。比如,git checkout HEAD~ foo.c會將提交節點HEAD~(即當前提交節點的父節點)中的foo.c複製到工作目錄並且加到暫存區域中。(如果命令中沒有指定提交節點,則會從暫存區域中拷貝內容。)注意當前分支不會發生變化。
- git checkout maint
當不指定文件名,而是給出一個(本地)分支時,那麼HEAD標識會移動到那個分支(也就是說,我們“切換”到那個分支了),然後暫存區域和工作目錄中的內容會和HEAD對應的提交節點一致。新提交節點(下圖中的a47c3)中的所有文件都會被複制(到暫存區域和工作目錄中);只存在於老的提交節點(ed489)中的文件會被刪除;不屬於上述兩者的文件會被忽略,不受影響。 git checkout master~3
如果既沒有指定文件, 也沒有指定分枝. 而是隻給出一段提交的歷史Hash, 只有HEAD會移動到相應的歷史提交. 這會造成HEAD分離, 非常危險的操作, 這個命令的說明只是爲了滿足你的好奇心而已, 不要使用這個命令.- git reset master~3
reset命令把當前分支指向另一個位置,並且有選擇的變動工作目錄和索引。也用來在從歷史倉庫中複製文件到索引,而不動工作目錄。
如果不給選項,那麼當前分支指向到那個提交。如果用–hard選項,那麼工作目錄也更新,如果用–soft選項,那麼都不變。 - gir reset
如果沒有給出提交點的版本號,那麼默認用HEAD。這樣,分支指向不變,但是索引會回滾到最後一次提交,如果用–hard選項,工作目錄也同樣。
–隔離了樹與路徑
– 的名稱叫做double dash,是bash的內置命令,用來標記可選命令選項的結束。即在它後面的帶 – 的字符串,不被當做是一個命令選項。
git branch
- git branch dev
- git checkout命令加上-b參數表示創建並切換,相當於以下兩條命令:
git branch dev
git checkout dev - git merge命令用於合併指定分支到當前分支。合併後,再查看readme.txt的內容,就可以看到,和dev分支的最新提交是完全一樣的。
注意到上面的Fast-forward信息,Git告訴我們,這次合併是“快進模式”,也就是直接把master指向dev的當前提交,所以合併速度非常快。
當然,也不是每次合併都能Fast-forward,我們後面會講其他方式的合併。 - 刪除分支:
git branch -d <name>
-D 強制刪除 - git merge –no-ff -m “merge with no-ff” dev
合併分支時,加上–no-ff參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併。
Bug分支
- git stash
用git status查看工作區,就是乾淨的(除非有沒有被Git管理的文件),因此可以放心地創建分支來修復bug。
- git checkout master
- git checkout -b issue-101
- git add readme.txt
- git commit -m “fix bug 101”
- git checkout master
- git merge –no-ff -m “merged bug fix 101” issue-101
- git branch -d issue-101
- git checkout dev # 回到dev幹活
- git stash list
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
一是用git stash apply恢復,但是恢復後,stash內容並不刪除,你需要用git stash drop來刪除;
另一種方式是用git stash pop,恢復的同時把stash內容也刪了:
你可以多次stash,恢復的時候,先用git stash list查看,然後恢復指定的stash,用命令:$ git stash apply stash@{0}
當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。
不使用stash的話index會公用 造成影響
多人協作
git remote add origin 地址
- git remote
- git remote -v
- git push origin master
- git push origin dev(dev 分支)
因此,多人協作的工作模式通常是這樣:
- 首先,可以試圖用git push origin branch-name推送自己的修改;
- 如果推送失敗,則因爲遠程分支比你的本地更新,需要先用git pull試圖合併;
- 如果合併有衝突,則解決衝突,並在本地提交;
- 沒有衝突或者解決掉衝突後,再用git push origin branch-name推送就能成功!
- 如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令git branch –set-upstream branch-name origin/branch-name。
這就是多人協作的工作模式,一旦熟悉了,就非常簡單。
小結
- 查看遠程庫信息,使用git remote -v;
- 本地新建的分支如果不推送到遠程,對其他人就是不可見的;
- 從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠程的新提交;
- 在本地創建和遠程分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠程分支的名稱最好一致;
- 建立本地分支和遠程分支的關聯,使用git branch –set-upstream branch-name origin/branch-name;
- 從遠程抓取分支,使用git pull,如果有衝突,要先處理衝突。
git tag
git tag <name>
- 可以用命令git tag查看所有標籤
- git tag v0.9 6224937 # 找到歷史提交的commit id
注意,標籤不是按時間順序列出,而是按字母排序的。可以用
git show <tagname>
查看標籤信息:git tag -a v0.1 -m “version 0.1 released” 3628164
還可以創建帶有說明的標籤,用-a指定標籤名,-m指定說明文字git tag -d v0.1
如果標籤打錯了,也可以刪除命令git push origin 可以推送一個本地標籤; 命令git push origin –tags可以推送全部未推送過的本地標籤; 命令git tag -d 可以刪除一個本地標籤; 命令git push origin :refs/tags/可以刪除一個遠程標籤。