iT邦幫忙

1

Git Remote branch & merge & fetch

今天要來介紹一些與Github有關的操作,還有branch的一些操作等等。

首先我們在Github,創建一個新的repository,因為我們已在local有創建好倉庫,故直接使用 git remote add origin remote repository URL,將我們local的倉庫給push進Github,接著 cat .git/config 會發現,已經local已經獲取URL等資料,最後在利用 git push origin master 將local所做的更動push至Github即可。而後,我們在Github的repository重整後,即可發現local的倉庫資料都已經傳送進來。

https://ithelp.ithome.com.tw/upload/images/20200602/20126182BB7vpRc4KS.png

https://ithelp.ithome.com.tw/upload/images/20200602/201261822OPHPgSQrh.png

如何解決merge產生的衝突?

git clone (你所要獲取github倉庫的url) : 可以clone任何為public的github倉庫到我們local端。但當我們對clone來的資料做更改,並想將所做的更動更新至原資料,就會被權限要求要輸入密碼及帳號。

git branch:可查詢當前分支, * 為當前分支。

git branch (分支名) :可創建新的分支。

git checkout (分支名) :可切換到指定分支。不同分支的修改並不影響。

git checkout -b (分支名) : 可新增一個branch並命名,且切換到其分支,等於結合git branch + git checkout。

git -branch -m (舊的分支名) (新的分支名) :可重新命名分支。

git diff (分支名) :可以拿當前分支與指定分支進行比較。

git merge (分支名) : 可將指定分支與當前分支合併,並產生新的一次commit。

我們在此處,將new-branch合併至master,如下圖。

https://ithelp.ithome.com.tw/upload/images/20200602/20126182UbCosuubBB.png

當有兩個以上分支同時修改同一份資料,並合併,就會產生衝突,這時在我們修改的同一份資料當中,git就會修改資料的格式並列出問題,此時我們只要到那份資料修改衝突的部分即可。

此處我們創建了new branch與new branch2 並共同都修改了同一份資料test.txt,而後在切換到master,先將new branch合併,再來合併new branch2,結果產生了conflict,如下圖,並git status發現顯示,

https://ithelp.ithome.com.tw/upload/images/20200602/20126182UCd6tDIyGd.png

both modified : test.txt,為了解決這個bug,我們到test.txt去查看,發現git修改資料格式,並列出問題,此時我們將內容進行修改,如下圖

https://ithelp.ithome.com.tw/upload/images/20200602/20126182qHECmzq8oc.png

修改完後git add完成更動,接著git status再次查看,已發現git已無報錯,最後,我們再次合併git merge new branch2,也沒跑出conflict,然後git commit,並cat test.txt,也發現,資料已經做修改。

https://ithelp.ithome.com.tw/upload/images/20200602/20126182PuSfUKhVFk.png

最後當我們要將修改push至github上時,又出現錯誤,這是因為我github上面創一個repo時,一個READme檔在之後產生,但local repository不知道有這個東西,所以出了問題,在這邊我們利用git pull origin master:作用是先 git fetch 遠端(github)的 branch,然後與local端的 branch 做 merge,產生一個 merge commit 節點,簡而言之就是,從遠端更新程式碼,並將 master 合併至新的分支

所謂的”遠端”預設叫做origin,當有多個不同遠端server時,就會有不同名子了

最後,我們在將local資料 git push origin master 進我們的github即可。

https://ithelp.ithome.com.tw/upload/images/20200602/20126182AGbi2WxWTF.png

https://ithelp.ithome.com.tw/upload/images/20200602/20126182bFAOAykhdx.png

如何在local端與remote端資料保持同步?

而如果我們要在local端進行開發,盡量先與遠端server資料保持同步,而分別有兩種方法fetch,pull。

方法一 git fetch origin master:可獲取遠端server master branch最新的version

ex:可能今天跟同事修改同一份資料,但同事手腳較快,先commit,而這時我們的local端的資料還在前一個遠端server的版本,故要先做同步再去進行開發。

我們在遠端 master branch 創建一個新的資料 fetch-test,並觀看commit,可看到最新版本commit為fff7c96。

https://ithelp.ithome.com.tw/upload/images/20200602/201261822LjODm9XF0.png

接著,我們在local git fetch origin master獲取遠端server master分支下最新的commit,可發現一個名為FETCH_HEAD的資料,而其資料位於.git下,其內容記錄了遠端server最新的commit資料(fff7c96)。

https://ithelp.ithome.com.tw/upload/images/20200602/201261824UpofFFGFR.png

另外在.git下我們還能看到名為HEAD的資料,而其內容紀錄的就是我們local最新的commit(134ac6a)。

https://ithelp.ithome.com.tw/upload/images/20200602/20126182Yv9XTJLW6b.png

而我們現在所要達到的目的就是,讓遠端 master branch的最新 commmit 去merge local端的commit。

https://ithelp.ithome.com.tw/upload/images/20200602/20126182zb0haT29ao.png

我們利用git merge FETCH_HEAD來同步資料,會觸發Fast-forward,也就是快轉機制,就是 Git 知道這個merge的過程,由於local master branch跟遠端master branch在領先新的commit前的都是一樣的,故在merge的時候會直接修改 master branch的 HEAD 指向位置,直接移動到遠端master branch 的 HEAD 也就是FETCH_HEAD

而我們在merge後,ls發現fetch-test已經同步到local,git log也發現最新的commit資料為fff7c96。

https://ithelp.ithome.com.tw/upload/images/20200602/20126182ygQyTAB4Ky.png

而當兩個端最後的修改不同,也就是A=>B , A=>C,不同步,我們直接git merge FETCH_HEAD會產生一個新的merge的commit,但此時還是不同步,變成遠端落後local,所以我們要利用git push origin master將local的修改push至遠端,最後查看git log 也可查看到最新的一個commit(merge),在遠端commit也發現多了一個merge的commit,這樣可達到同步。

https://ithelp.ithome.com.tw/upload/images/20200602/20126182nBc7NzILPy.png


尚未有邦友留言

立即登入留言