Try   HackMD

Git 開發流程

基本知識

origin:我自己的遠端儲存庫(網頁上的)
upstream:我原本 fork 的原專案

  • 如果要更新到自己這邊就是 origin
  • 如果是想拉取原作者更新,就是拉 upstream

多人開發情境

現在假設有 A,B,C 三個人開發:

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

接下來細部說明每一個步驟的開發流程:

對於專案成員 B,C

1. 先 push 剛剛開發完的本地變更到自己的分支 (這裡代稱 feature)

先確認自己在哪個分支:

git branch

接下來是最重要的一步,必須要先確保自己寫的東西有先被存到遠端上

git add <你要推上去的檔案>
git commit                    # 也可以用 git commit -m "你想打的message標題"
git push origin feature       # 若已設定過確保自己在feature,可直接 git push

2. 切換到自己的 master

切換前必須要將 feature 的變更都 push 完成,使用以下指令確認還有哪些檔案與網頁上的 feature 有差異:

git status

若出現一些你不想推上去的檔案,但你仍然想換分支,可以使用以下指令丟棄所有目前與網頁上的 feature 不同的部分:

git stash

確保本地檔案與網頁上的 feature 一樣後,再換至自己的 master

git checkout master

3. 拉回原專案 master 的更新到自己的 master

如果還沒設定過上游,先用以下指令設定(若看到報錯代表已經設定過了):

git remote add upstream https://github.com/A的帳號/專案.git

確保自己的 master 有和原專案同步:

git fetch upstream
git log                      # 只是用來看A相對於你的master做了哪些變更
git merge upstream/master

git pull = git fetch + git merge
用 fetch 再 merge 會比較安全,才決定要不要 merge
用 pull 就會直接合併到底了

4. 更新自己遠端的 master 分支

概念:origin/master 是你自己 fork 過來的,upstream/master 才是專案管理者 A 的 master。剛剛同步完 upstream/master 到本地了,接下來要將新變更也 push 到我們的 origin/master

git push origin/master

5. 把最新的 master 合併到自己的 feature

準備切回 feature 分支並且將上一步的更新 merge 進來:

git checkout feature
git merge master

merge 如果遇到衝突怎麼辦?

  • 假如 B 開發了新的 script ,而剛剛從 A 那邊 merge 進來的是網頁的新功能,在這種「兩人改的檔案不重複」的狀況下,git 會自行處理合併,分別取用剛剛第 1 步 B 推上去的變更和第 4 步從 A merge 過來的新改動,而不會產生衝突
  • 但若「兩個人改的檔案有重複」,終端機會跟你說哪些檔案有衝突,你需要手動打開那些檔案解決標記,大致上會長這樣:
    ​​​​<<<<<<< HEAD
    ​​​​master 的內容
    ​​​​=======
    ​​​​feature 分支原來的內容
    ​​​​>>>>>>> some-commit-id
    

6. 在網頁上 feature 分支發 Pull Request

解決完衝突,確保 merge 完成後就可以至自己的 GitHub 頁面,並且點選 Compare & Pull Request 的按鈕,原專案管理者 A 就會收到其他人開發的新變更了!