關於使用 git 合做開發時的通用操做

一般咱們工做時是這樣操做

說一下使用 git 作版本控制的時候的工做流程php

git add -A           #須要添加到版本庫中的文件 -A 就表明着全部文件(除開了 .gitignore忽略掉的文件)
git commit -m '本次提交的備註'
git pull            #將遠程的庫和本地的庫版本同步一下,由於遠程庫可能發生了修改(多人合做開發時)
git push

這樣操做的前提是本地遠程都是同一個 master 分支上git

最可能會碰到的問題

以上操做前兩步一般不會碰到問題,最容易發生問題的是 git pull 這一步
由於多人開發時不免碰到同時修改了同一個文件,那麼就會產生衝突
git 是根據文件每行發生的修改進行的斷定的,若是同時對同一文件的同一行發生了修改,就卡死到這一步上了segmentfault

怎麼解決這個問題

我經常使用的是命令行和 phpstrom 中的版本控制工具,最推薦的是命令行操做,別的圖形界面也是調的命令行接口
直接學會git 的命令是學習成本最低的一種方式,一次學會處處可用啊!bash

命令行還有個強大的地方就是它的提示一般就是你解決問題的方法,照着提示打就行(要善用提示啊,別看見報錯就慌了)編輯器

咱們作一個實驗,我本身的一個版本庫本地和遠程同時發生了修改,並且是操做的同一個文件,
我直接進行 git push操做工具


看到提示沒?提示中的 hint 中說了,向遠程庫中更新被拒,由於遠程有了修改而本地沒有(說白了就是沒同步),
這一般發生在另外一個版本庫向遠程推送了相同的文件(就是兩我的在這個版本下同時操做了同一個文件),
提示中給出緣由以後緊接着給出瞭解決辦法(e.g., 'git pull ...')before pushing again,學習

咱們按着它給的提示操做一下
圖片描述測試

一般若是兩我的之間的操做不發生衝突好比同時修改了同一個文件的同一行的狀況下就會進入commit
編輯界面了,可是我給他人爲的形成一個錯誤,這個錯誤就是咱們最常碰到的錯誤,合併衝突
看到提示中的最後一行了沒有?
Automatic merge failed; fix conflicts and then commit the result.
自動合併失敗了,請修復衝突並再次提交spa

若是文件不少我怎麼去找到它?命令行

  • 一種是靠界面工具主動把錯誤推到你面前
  • 另外一種就是本身去找了

第一種方法坑爹的地方就是好多工具他給你提示就提示一次,你若是給關了就不會再提示了,可是該提交不上去的
仍是提交不上去,並且若是是線上火速修復的時候你的編輯器是幫不到那麼遠的
咱們選第二種,確定不是挨個文件去翻啊!會死人的

有一個頗有用的命令

git status

圖片描述
標紅的文件都給你了,並且還給你了須要執行的命令,你別僞裝看不到啊!
固然這個時候直接git add && git commit會出事的,你還沒解決衝突呢!
咱們去這個衝突文件中解決掉衝突本地能跑通了再提交,並且這個錯誤提示會指名文件路徑的,我這個衝突文件
由於正好是在項目的根目錄下才沒有的

打開這個文件咱們看到以下的內容:
圖片描述

我這是在 phpstrom 中打開的文件,若是phpstrom 能讀取到你項目中的 .git/ 目錄是能夠進行版本控制的
這裏phpstrom 就幫你把衝突文件標紅了,多麼醒目~固然這也是咱們本身找的
若是文件內容特別多可是就一兩處衝突時咱們直接搜索關鍵詞 HEAD或者<<<<<<<就行,你懂的...
被尖角號擴起來的就是衝突的地方,接下來就是保孩子仍是保大人解決衝突的時候了,找到誰和你改的同一處代碼

什麼?你說你找不到是誰?你沒看到代碼衝突塊下的 779833d952d8a6557b2e8eba3bd192ede5cb6ca0
這一段文字嗎?你先別激動,這個點還不適合開車,這個是提交的 commit-id,你每次提交都會產生的一個標識
要查看這究竟是誰和個人代碼衝突了就執行下面的命令

git log 779833d952d8a6557b2e8eba3bd192ede5cb6ca0

第一行就是你要的結果,
若是直接git log -p 就是列出全部的提交記錄 -p 就是顯示出修改的地方

衝突塊部分 HEAD就是你寫的代碼,下面的是別人寫的,去掉其中一個把那些標籤清理乾淨,測試一下沒問題了
git add && git commit && git pull && git push 這四連技好了,世界清淨了

這合併的時候發生了什麼?

這是我在 segmentfault 中給出的答案:

好比你從一個git log爲1,2,3,4,5,6的遠程庫拉取到了本地,
另外一個同事也拉取了一樣的代碼,並且你的同事先於你提交到遠程了,
此時遠程的版本是1,2,3,4,5,6,7_new,8_new,
而你當前只是本地的版本1,2,3,4,5,6,7_local,8_local,9_local
從這裏你就能看出你前一部分和遠程的同樣,後一部分和遠程的不同,
這個時候你不能正常推送上去的,若是你採起git push origin master --force
那麼遠程的版本就變成了1,2,3,4,5,6,7_local,8_local,9_local
以前你同事推送的7_new,8_new這兩次推送被覆蓋了,這不是你們想要的狀況
所以須要git pull來將本地的版本合併成樣
1,2,3,4,5,6,7_new,7_local,8_local,8_new,9_local,10_commit_merge
遠程和本地的排序是按當時 commit 的時間來排的,最後一個10_commit_merge就是你本地遠程合併的標誌,最後你推送到遠程倉庫的應該也是這個,
由於大家操做的是同一個庫始終要保持代碼的同步,因此一旦版本庫發生改動同一分支下的全部人都要跟着去同步他,由於各開發各的直接往上推 git 還沒智能到幫你處理衝突的地步

若是隻想合併分支裏的幾個文件怎麼辦?

好比我有兩個分支

* alpha
  dev

我只要 dev 中的某幾個文件, 好比 README.md 和 LICENSE.md, 那麼我就

git checkout dev /path/to/README.md /path/to/LICENSE.md

就會拉取 dev 分支中的這幾個文件覆蓋到 alpha 分支上, 注意拉取的文件會強制覆蓋, 而後你 git diff 一下這幾個文件看有沒有問題, 直接git commit && git pull && git push 一套帶走就行

答案連接
博客原文

相關文章
相關標籤/搜索