git使用手冊,有這些就夠了^_^

日常工作中,有了這些git命令,解決你代碼提交與合併上的痛點,再也不怕代碼和別人衝突了,再也不用爲合併代碼、沖掉別人代碼而頭痛了。。。

一、clone倉庫中的代碼

git clone [svn_addr].git,其中[svn_addr].git爲代碼倉庫的地址。

二、提交本地test分支作爲遠程的master分支
git push origin test:master

三、提交本地test分支作爲遠程的test分支
git push origin test:test

四、刪除遠程分支:
git branch -r -d origin/branch-name  
git push origin :branch-name


五、創建基於遠端的某個分支的本地分支:
git branch -b dev-branch origin/dev-branch

git checkout -b dev-branch origin/dev-branch (創建並切換到該分支)

六、將該倉庫中的其他分支的提交,合併到當前分支:
git cherry-pick kldsfdkldl(提交的哈希值)

七、改變基板:
git rebase dsfjalkjd(某一版的哈希值)
該命令的應用場景:當本地分支有commit時,如果本地基版落後與遠端分支,此時在push代碼前,應該做一次git pull去拉一下遠端的最新代碼,然後將本地的提交push到遠端,這時,git實際上是做了兩步:1.遠端代碼拉取到本地後,將本地的那次commit根據時間合併到遠端代碼上 2.將遠端拉取下來的代碼與本地落後的代碼進行merge,並作一次commit。即本地會產生兩次commit,一次是實際自己提交的代碼的commit,一次是git自動merge的代碼的commit,所以,其實自動merge的那次commit是不需要出現在提交log中的,這時,可以使用git rebase命令將本地那次提交的基版設爲拉取下來的最新代碼,這樣,git就會自動消除他自己產生的那次merge的commit。

八、在使用 Git 作爲版本控制的時候,我們可能會由於各種各樣的原因提交了許多臨時的 commit,而這些 commit 拼接起來纔是完整的任務。那麼我們爲了避免太多的 commit 而造成版本控制的混亂,通常我們推薦將這些 commit 合併成一個:
場景如下:
commit d526a0529901bc47e1fcffab0c87c29dd4df2311
Author: Joven <[email protected]>
Date:   Thu Jun 8 20:47:11 2017 +0800


    第三次提交代碼


commit 5b9c68b01250a1299956937c28171fd5e59ccf2f
Author: Joven <[email protected]>
Date:   Tue Jun 13 20:41:28 2017 +0800


    第二次提交代碼


commit e23aabe78470aae79fff8cc839e1568182581c97
Author: Joven <[email protected]>
Date:   Tue Jun 13 18:06:47 2017 +0800


    第一次提交代碼


commit be49d734eb19b65e02a8d34e16c7bfdc9ce21441
Author: Joven <[email protected]>
Date:   Tue Jun 13 18:04:17 2017 +0800


    修改XXX情況出現的Bug
其中"第一次提交代碼", "第二次提交代碼", "第三次提交代碼" 三次提交均爲"XXX功能的添加"代碼,因此,想將這三次提交合併爲一次在提交到遠端,步驟如下:

(1)git rebase -i be49d734eb19b65e02a8d34e16c7bfdc9ce21441
解釋:先將提交 d526a0529901bc47e1fcffab0c87c29dd4df2311,
5b9c68b01250a1299956937c28171fd5e59ccf2f,e23aabe78470aae79fff8cc839e1568182581c97進行合併,則需要將基版變換爲最早一次提交的上版,即e49d734eb19b65e02a8d34e16c7bfdc9ce21441。
(2)接下來會進入到vim編輯模式,如下:
pick d526a05
pick 5b9c68b
pick e23aabe
下面還會帶有解釋(Commands):
#p, pick = use commit
#r, reword = use commit, but edit the commit message
#e, edit = use commit, but stop for amending
#s, squash = use commit, but meld into previous commit
#f, fixup = like "squash", but discard this commit's log message
#x, exec = run command(the rest of the line) using shell
其中的s(squash)即爲將本次提交合併到前一次中,因此,我們將上面的三行修改爲:
pick d526a05
s 5b9c68b
s e23aabe

保存退出(:wq)後,會進入輸入提交log message的界面,將沒有以#開頭的行全部刪除掉,然後重新起一行寫合併後的提交log信息。
(3)然後保存退出。完成以上後,使用git log查看提交的歷史信息,即可發現將三次提交合併爲一次了。


九、cherry-pick與merge的相同點與區別:
git cherry-pick pickID(提交代碼時的唯一哈希值)
相同點:兩個都是將一個修改的代碼合併到另一個分支上。
不同點:cherry-pick pickID是隻將代碼倉庫中pickID這次提交的修改合並過來,而merge則是將上次更新的代碼到現在最新代碼之間的差異都進行合併,因此,如果要提交的這次代碼與最新代碼之間有好幾次提交,則可能將無關代碼合並過來或者可能會單獨出現一版提交merge代碼的記錄。

十、遠端已經刪除的分組,在本地依然能看到,可以使用命令:
git remote prune origin
進行清除。

十一、git衝突處理:
1. 在cherry-pick時出現衝突,會報:
error: 不能應用 38e1b4e... XXXXX
提示:衝突解決完畢後,用 'git add <路徑>' 或 'git rm <路徑>'
此時說明已經衝突了,用git status進行查看,會出現:
要提交的變更:
    修改:test.cpp
未合併的路徑:
    雙方修改:xxxx.cpp
此時的代碼沒有進行commit,但是已經merge過來,下面會給出的“雙方修改:xxxx.cpp”即爲衝突的文件名。
編輯衝突的文件xxxx.cpp,文件中介於 <<<<<<<(七個‘<’) HEAD  和 ======= 之間的內容是版本庫中的代碼,介於 ======= 和 >>>>>>> 之間的內容是本次自己修改的與版本庫代碼衝突的代碼,可以手動修改這部分代碼(即手動解決衝突),手動解決衝突後,執行 git add <文件>標記衝突已解決。
解決完衝突後,執行 git status進行查看,此時已經沒有衝突文件了,可以執行git commit進行提交。

十二、git撤銷某次commit
找到需要回退的那次commit的 哈希值,執行如下命令:
git reset --hard commit_id

此命令會直接拋棄commit_id之後的所有提交的代碼,直接將代碼回滾到commit_id.

※技巧:在日程工作中,往往是先使用git checkout  -b dev-branch創建一個臨時分支,修改好代碼後,提交這次修改到本地倉庫,然後查看commit ID,然後git checkout到master分支,然後git pull將代碼拉取到最新,然後將dev-branch分支修改的代碼運用 git cherry-pick commit_ID到主分支,完了之後將dev-branch分支進行刪除,再根據最新的代碼創建本地de-branch分支,繼續進行修改開發。


/******************* 掃描左上角二維碼關注公衆號,get更多工作中的實用技巧。*****************/


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章