今天要來介紹一些與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的倉庫資料都已經傳送進來。
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,如下圖。
當有兩個以上分支同時修改同一份資料,並合併,就會產生衝突
,這時在我們修改的同一份資料當中,git就會修改資料的格式並列出問題,此時我們只要到那份資料修改衝突的部分
即可。
此處我們創建了new branch與new branch2 並共同都修改了同一份資料test.txt,而後在切換到master,先將new branch合併,再來合併new branch2,結果產生了conflict,如下圖,並git status發現顯示,
both modified : test.txt,為了解決這個bug,我們到test.txt去查看,發現git修改資料格式,並列出問題,此時我們將內容進行修改,如下圖
修改完後git add完成更動,接著git status再次查看,已發現git已無報錯,最後,我們再次合併git merge new branch2,也沒跑出conflict,然後git commit,並cat test.txt,也發現,資料已經做修改。
最後當我們要將修改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即可。
而如果我們要在local端進行開發,盡量先與遠端server資料保持同步,而分別有兩種方法fetch,pull。
ex:可能今天跟同事修改同一份資料,但同事手腳較快,先commit,而這時我們的local端的資料還在前一個遠端server的版本,故要先做同步再去進行開發。
我們在遠端 master branch 創建一個新的資料 fetch-test,並觀看commit,可看到最新版本commit為fff7c96。
接著,我們在local git fetch origin master獲取遠端server master分支下最新的commit,可發現一個名為FETCH_HEAD的資料,而其資料位於.git下,其內容記錄了遠端server最新的commit資料(fff7c96)。
另外在.git下我們還能看到名為HEAD的資料,而其內容紀錄的就是我們local最新的commit(134ac6a)。
而我們現在所要達到的目的就是,讓遠端 master branch的最新 commmit 去merge local端的commit。
我們利用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。
而當兩個端最後的修改不同,也就是A=>B , A=>C,不同步,我們直接git merge FETCH_HEAD會產生一個新的merge的commit,但此時還是不同步,變成遠端落後local,所以我們要利用git push origin master將local的修改push至遠端,最後查看git log 也可查看到最新的一個commit(merge),在遠端commit也發現多了一個merge的commit,這樣可達到同步。