使用小烏龜和命令合並git代碼,讓沖突更簡單!
Git作為一個必備的版本管理之一,其重要性不言而喻不言而喻。
版本管理功能可能都差不多,svn也是。
git作為分布式版本管理工具,允許你在自己家,沒網的時候也隨心所欲地提交事物(當然更多指是的代碼),這一點可能和svn就絕對地分隔開來了。
git的功能很多,我們也沒必要每個都要去精通。我們需要做的,只是讓自己的工作能夠運行得很順暢不卡殼。就夠了。下文將以目的為出發點,提出一些實用主義。
git其實本身只是一些命令,也就是說,如果不出意外地話,你要一個個代碼地去敲出來,然后達到你版本管理的作用。然而,這對一些還不是很懂的小伙伴來說,這太扯淡了。然后,可能就不用這塊金磚了。
入門,工具選用。基於git提供的強大命令集,基於許多小白,自然少不了有人會提供一些可視化的界面給你操作。(但請不要忘記其本質)。工具如,tortoisegit(且稱之為小烏龜),sourcetree。個人覺得小烏龜更好用,我曾經看其他同學用過以及自己試用過sourcetree,結果是sourcetree表面看起來整體界面牛逼,很全面,但是真正用的時候感覺各種不方便。還是小烏龜實用些,沒有華麗的表面,只是簡單的右擊菜單,但是核心上面下了功夫了。下面將以小烏龜講解。
入門,小白操作。首先,咱們拿到這個工具,應該不會一上來就進行自己開創性的工作吧(個人感覺),比如,你如果想成為作家進行寫作,那么你肯定得先讀過許多別人寫的文章吧。所以,我們用git也是,先拿別人的倉庫,拿過來搞搞嘛。右擊一下小烏龜的菜單》克隆,然后把別人的倉庫搞到本地來,然后研究研究。當然,咱們最開始的時候也可以不用進行權限驗證之類的操作。搞下來之后,先看看別人的操作日志嘛,右擊菜單 查看日志或show log,然后你就可以查看整個項目的提交情況了。然后,你得想自己改個東西,然后提交一下。這簡單,只要在你強加工具把內容改掉,這時,你就能看到這個文件被改變了,然后右擊提交,輸入備注信息,就提交了。(注意,這時是需要身份驗證的,在設置里輸入授權信息就可以了)。到這里的提交,咱們是不和網絡打交道的,也就是說,提交的操作是可以斷網操作的。然后,右擊推送push操作一下,就可以正式把改動推送到遠程了,這時查看這個倉庫的人就可以看到你的改變了。如果沒什么意外,你已經學會了使用git工具進行事務變更操作了。但是有個問題,如果按照這些操作,那么所有的操作都將會是順序進行的,也就是說,在一個時間點,應只有一個人在操作倉庫里的東西,這太扯淡了,怎么只有一個人操作呢,項目基本都意味着同時有n個人操作,可能是同一個文件,同一個單詞。針對這種情況,版本工具只會也只能做一件事情,報告老板,你們發生沖突了,你們自己解決下吧,我干不了這活。其實沖突還好,關鍵是兩個人改的東西,到最后要呈現不一樣的效果,比如兩個項目,雖然都改同一個地方,但是上線的時間點不一樣,所以,不可能把沖突解決完就行,而是完全隔離開兩個做的東西。所以有了分支。分支相當於有多份相同的倉庫,你用你的,我用我的,自然就沒有問題了。右擊菜單,創建分支,切換分支,然后你就相當於搞到了另一個倉庫了,這又是一片不一樣的天地。然后又做起來了你的老本行,修改~提交~推送~查看日志。ok,沒什么其他事的話,你已經可以正常工作一段時間了。但是,還差一個問題,你的分支怎樣讓別人發現?別人不可能切到你的分支來搞事情吧,你得主動把你你的分支合並到master老板那里去。切換到master,右擊合並(merge),選擇你要合並過來的分支,就可以把代碼合並了,沒什么問題的話,git已經自動把代碼合並好了,你只要推送一下就行了。ok,一切都工作得很好。那么,萬一呢,我說的是萬一合並出了問題呢?怎么辦?這才是體現你功底的時刻呢,順境你好我好大家好,而狹路相逢勇者勝。
出現沖突,怎么解決?1. 直接使用別人的版本,然后自己把自己改的代碼一點點加上去,這對於少量的改動,還是很不錯,先假設自己錯了,然后自己改正自己。真棒,是個好孩子。 2. 直面沖突,發現自己的代碼是別人沒有的,那么,把自己的加上;發現別人有的自己沒有,把別人的加上;發現自己的和別人的完全是同一個地方有重疊,那么只能找當事人一起,共同探討方案了,要么你進,要么你退。
說了半天,還沒說到高級用法呢?
1. git branch -a //列出所有拉取下來的分支
2. 分支創建相關 //依據遠程分支新建分支
2.1 git checkout -b develop origin/develop
2.2 git branch --track develop origin/develop #不存在分支
2.3 git branch --set-upstream-to develop origin/develop #已存在分支
2.3 git branch --set-upstream develop origin/develop
2.4 git branch <new_branch> # 創建新的分支
2.5 git checkout -b develop # 創建新的分支,並且切換過去
2.6 git checkout -b 新分支名 老分支名(這種寫法的意思為基於老分支創建新的分支)
3. git pull //拉取本分支
4. git fetch //拉取所有分支
5. git clone git@192.168.1.206:root/frontend_oss.git
6. git push develop origin/develop
6.1 git push # push所有分支
6.2 git push origin master # 將本地主分支推到遠程主分支
6.3 git push -u origin master # 將本地主分支推到遠程(如無遠程主分支則創建,用於初始化遠程倉庫)
6.4 git push origin <local_branch> # 創建遠程分支, origin是遠程倉庫名
6.5 git push origin <local_branch>:<remote_branch> # 創建遠程分支
6.6 git push origin :<remote_branch> #先刪除本地分支(git br -d <branch>),然后再push刪除遠程分支
6.7 git push -v --progress "origin" REL_20170228_baiduapi_v1.0:REL_20170228_baiduapi_v1.0
7. git merge origin/master
7.1 分支合並和rebase
7.2 git merge <branch> # 將branch分支合並到當前分支
7.3 git merge origin/master --no-ff # 不要Fast-Foward合並,這樣可以生成merge提交
7.4 git rebase master <branch> # 將master rebase到branch,相當於: git co <branch> && git rebase master && git co master && git merge <branch>
8. git stash save -- "this is a stash save" # 保存一個暫存節點
8.1 git stash list # 暫存列表
8.2 git stash pop | apply # 恢復暫存內容
8.3 git stash drop # 刪除暫存區
9. 生成ssh key的步驟,獲取帶權限的倉庫
9.1 cd到~目錄, 然后運行:ssh-keygen -t rsa
9.2 運行完成后, 會在/c/Documents and Settings/username/.ssh目錄下生成2個文件: id_rsa, id_rsa.pub
9.3 然后把id_rsa.pub文件傳給服務器,就可以使用GIT了
10. git add a.html | * # 將文件修改添加到暫存區
11. git commit -m "commitle..." # 提交本地修改,注:未推送到遠程
12. git clean -fdx # 清理倉庫,對於一些無法提交的提示操作
13. 日志查看相關
13.1 git log --pretty=oneline 文件名 # 查看某個指定文件的提交記錄
13.2 git log # 所有提交記錄
13.3 git show <git提交版本號> <文件名> # 查看具體的修改詳情了
13.4 git blame file_name # 先查看某行代碼由誰寫的,在哪個commit中提交
13.5 git log -p -2 # -p 選項展開顯示每次提交的內容差異,用 -2 則僅顯示最近的兩次更新
13.6 git log --stat # 僅顯示簡要的增改行數統計
14. git如何正確回滾代碼,強制push遠程分支
14.1. 首先兩步保證當前工作區是干凈的,並且和遠程分支代碼一致
14.2. 備份當前分支(如有必要)
14.3. 恢復到指定的commit hash
$ git reset --hard resetVersionHash
14.4. 把當前分支強制提交到遠程
$ git push -f origin currentBranch
舉個例子,如下代碼是合並過后的代碼,合並時遇到沖突為,兩邊同時改動了同一行代碼,且兩邊都同時是增加,那么我們可以使用 , user their's before mine 選項保留兩個更改。這樣沖突就不存在了。如果遇到是別人的正確,那么直接 user their's 就行。
使用 revision graph 可以清楚的看到各個分支的提交和合並情況,讓你對整個項目有個直觀的感受。