1. 程式人生 > >解決Git上傳衝突

解決Git上傳衝突

在下面的幾個案例裡面,為了使講述的內容更簡潔,我們將不會按照上面的規範去寫很規範的提交註釋,並使用-m選項去做git commit。聽我們說,但是不要學我們做^^。

衝突發生在不同檔案

你遇到的最簡單的私有專案的配置可能是隻有兩三個開發者。這裡的“私有專案”是指閉源不會對外公佈的專案,但是你和其他開發者都可以訪問程式碼庫。
在這個背景下, 你可以像使用Subversion或其他程式碼管控系統一樣去跟蹤一個專案流程。你仍然可以使用比如離線上傳、分支、合併等功能,並且流程是非常相似的。主要的不同是合併操作可以只需要有客戶端,而不必立即同步到服務段。讓我們來看一下,當兩個開發者開始共同開發這個程式碼庫會是什麼樣子。John是其中一位開發者,克隆了這個程式碼庫,做了一些修改後,然後把修改上傳到了本地。(在這個案例裡面,我們將以…代替出現的大段出現的協議資訊,以簡化案例)

# John's Machine
$ git clone [email protected]:simplegit.git
Initialized empty Git repository in /home/john/simplegit/.git/
...
$ cd simplegit/
$ vim lib/simplegit.rb
$ git commit -am 'removed invalid default value'
[master 738ee87] removed invalid default value
 1 files changed, 1 insertions(+), 1 deletions(-)

另外一位開發者,Jessica,做了同樣的事情, 克隆了工程並提交了自己的修改到本地:

# Jessica's Machine
$ git clone [email protected]:simplegit.git
Initialized empty Git repository in /home/jessica/simplegit/.git/
...
$ cd simplegit/
$ vim TODO
$ git commit -am 'add reset task'
[master fbff5bc] add reset task
 1 files changed, 1 insertions(+), 0
deletions(-)

現在Jessica同步她的修改到伺服器上:

# Jessica's Machine
$ git push origin master
...
To [email protected]:simplegit.git
   1edee6b..fbff5bc  master -> master

John也打算同步他的修改到伺服器:

# John's Machine
$ git push origin master
To [email protected]:simplegit.git
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to '[email protected]:simplegit.git'

John沒能成功同步他的修改到伺服器,因為Jessica也在同時做了一樣的事情。這一點對曾用過Subversion的你特別重要,因為你可能注意到了兩個開發者的修改沒有涉及相同的檔案。在這種情況下,Subversion會自動完成這個合併,但是Git卻不會,所以你需要先在本地merge兩個人的修改。John不得不先獲取Jessica的修改,將這些修改合併再和伺服器同步。

$ git fetch origin
...
From [email protected]:simplegit
 + 049d078...fbff5bc master     -> origin/master

這時,John的本地倉庫差不多是這樣的:
衝突不含相同檔案
John’s divergent history

John知道Jessica的修改與自己的並不相關,但是他還是不得不先把這些修改合併到他本地的庫中,這樣才會被伺服器允許同步他的修改:

$ git merge origin/master
Merge made by recursive.
 TODO |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

合併動作完成了,John的上傳記錄現在是這個樣子的:
John合併origin/master修改的提交記錄
John’s repository after merging origin/master.

現在John可以測試他的程式碼以保證它們仍然正常有效,並且他可以同步自己的修改到伺服器了:

$ git push origin master
...
To [email protected]:simplegit.git
   fbff5bc..72bbc59  master -> master

最終,John的提交記錄是這個樣子的:
John同步了修改後的提交記錄
John’s history after pushing to the origin server.

衝突發生涉及同一檔案

與此同時,Jessica還在開發一個主題分支。她建立了一個名為issue54的分支,然後在這個分支上提交了三次修改。她還沒有獲取John的修改,現在他的提交記錄是這樣的:
Jessica主題分支的記錄
Jessica’s topic branch.

Jessica要同步John的修改:

# Jessica's Machine
$ git fetch origin
...
From [email protected]:simplegit
   fbff5bc..72bbc59  master     -> origin/master

Jessica拉取了John同步到伺服器上的修改,現在Jessica的提交記錄是這樣的:
Jessica's history after fetching John's changes
Jessica’s history after fetching John’s changes.

Jessica認為她的分支已經準備好了,但是她想知道她必須merge哪些東西后她才可以向伺服器同步她的修改。她執行git log 去檢視以下內容:

 $ git log --no-merges issue54..origin/master
commit 738ee872852dfaa9d6634e0dea7a324040193016
Author: John Smith <[email protected]>
Date:   Fri May 29 16:01:27 2009 -0700

   removed invalid default value

“issue54..origin/master”這個引數的語法是一個日誌過濾器,可以要求Git只顯示在第二個引數分支origin/master上有,但是issue54分支上還沒有的commits的列表。更多這個引數語法請參看”Commits Ranges”。
現在,我們從輸出看到Jessica未整合的John的提交只有一個。如果Jessica要整合origin/master,這個commit將會修改她在本地的內容。現在Jessica要先合併她的主題分支到主分支中,再合併John的那個commit到她的主分支,最後同步到伺服器。 首先,Jessica回到她的主分支去整合所有這些修改:

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.

Jessica可以先合併 origin/master,也可以先合併issue54分支,它們都是需要上傳的,所以順序並不重要。最後的專案狀態snapshot都應該是一樣的, 不管採用什麼順序,只有上傳記錄會有一點不同而已。Jessica選擇先合併issue54分支:

$ git merge issue54
Updating fbff5bc..4af4298
Fast forward
 README           |    1 +
 lib/simplegit.rb |    6 +++++-
 2 files changed, 6 insertions(+), 1 deletions(-)

合併成功。就像你看到的這是一個非常簡單快推進, 現在Jessica要開始合入John的修改了(即origin/master主幹分支的內容):

$ git merge origin/master
Auto-merging lib/simplegit.rb
Merge made by recursive.
 lib/simplegit.rb |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

所有的東西都很乾淨的合併了,現在Jessica檢視到的上傳記錄像是這樣:
Jessica's history after merging John's changes
Jessica’s history after merging John’s changes

Jessica的master分支是可以訪問origin/master的,所以她能夠成功的同步修改到伺服器(假設John在這段時間沒有上傳過其他修改):

$ git push origin master
...
To [email protected]:simplegit.git
   72bbc59..8059c15  master -> master

每一個開發者都提交自己的修改並且也成功合併過別人的修改。
Jessica's history after pushing all changes back to the server
Jessica’s history after pushing all changes back to the server

這是一個最簡單的工作流程例項。你在開發一段時間後,通常是指在一個主題分支開發中,要整合這段時間完成的修改到你的master分支以便提交。當你打算分享?你的修改,你把修改合入你的master分支,獲取origin/master並且合入,最後同步到伺服器。這流程順序類似下面這個圖:
General sequence of events for a simple multiple-developer Git workflow.
General sequence of events for a simple multiple-developer Git workflow.

內容有點多,翻譯不夠細緻,後續持續改進。

原文連結

相關推薦

解決Git衝突

在下面的幾個案例裡面,為了使講述的內容更簡潔,我們將不會按照上面的規範去寫很規範的提交註釋,並使用-m選項去做git commit。聽我們說,但是不要學我們做^^。 衝突發生在不同檔案 你遇到的最簡單的私有專案的配置可能是隻有兩三個開發者。這裡的“私有專

Git-衝突解決方法

報錯內容: failed to push some refs to '[email protected]:Sunpro108/Sunpro_Blog.git' hint: Updates were rejected because the remote contains wor

如何解決git檔案出錯[rejected] master -> master (fetch first) error: failed to push some refs to '

使用Git上傳本地檔案到github時,一直報錯,這個問題也困擾了我2天,終於被解決。 git add . git commit -m"peTzxz" git push origin master 當執行到push時,就會報錯,報錯程式碼如下: Mac

Git——檔案到分支以及解決衝突

先將主檔案夾克隆下來 然後點選克隆下來的資料夾,滑鼠右鍵,選擇git bash。 (必須要先克隆下來主資料夾,然後再切換分支,否則沒法切換) 鍵入以下命令切換分支 git check 分支名 可以看到,這樣就切換到“dev_rens

Git項目提示Push rejected: Push to origin/master was rejected解決辦法

was clas 命令 pull his 被拒 ltr all tran 推送被拒絕:推送到源/主被拒絕 首先是你的項目中有和和歷史不符的東西 Push rejected: Push to origin/master was rejecte

GIT下載報錯:[You do not have permission to pull from the repository]的解決方案!

git報錯:You do not have permission to pull from the repository 解決方案:修改windos憑據 第一步:開啟我的電腦 第二步:選擇此電腦,右擊彈出框點選屬性進入控制面板 第三步:進入控制面板 第四步

git程式碼報錯ssh: connect to host github.com port 22: Connection timed out解決辦法

當在遠端庫上設定了SSH 之後還是報錯連線超時,問題如下 $ git push origin master ssh: connect to host github.com port 22: Connection timed out fatal: Could not read

git 解決檔案超過100m不能的問題

網上試了很多方法都不能解決我的問題 我看了一下 在git push的時候提示上圖,這是因為git上傳檔案有限制 解決辦法 用於版本化大檔案的開源Git擴充套件 Git大檔案

git 一個空檔案的解決方案,可使用命令列建立.gitkeep檔案

什麼是.gitkeep .gitkeep是一個約定俗成的檔名並沒有什麼特殊規則, 它就相當於一個佔位,0位元組。那它有什麼用呢?當你提交提交,目錄中有空資料夾的時候,git會自動忽略掉,而有時候你就

eclipse git下載程式碼auth錯誤解決辦法

當出現這種問題的時候,主要是eclipse裡面的rsa key沒有提交到 gitLAB 上 點選window > Preferences > General > Network Connections > SSH2>Generate

git 至github出現error:your local changes to the following files would to be overwritten解決辦法

git 在上傳的時候出現瞭如下錯誤,當我從dev分支切換到主分支的時候出現了這個錯誤。修改的程式碼需要覆蓋。ok,那在切換之前咱們按照提示 it 先檢視一下跟蹤的檔案的狀態 git status 結果如下: 然後我們新增一下這個檔案。 這樣,我們就可以把已經修改

hexo部落格主題,git,報錯Template render error的解決方案

報錯資訊 INFO Start processing FATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/do

git git庫時報錯,提示有衝突

具體報錯資訊如下: error: Your local changes to the following files would be overwritten by merge: .idea/workspace.xml Please commit your

使用Git本地項目到http://git.oschina.net

idfa noi kaa nom oda wsb stc xfs yep 本文前言,因倡導開源精神,我也把代碼傳上了開源社區,可是,當初使用http://git.oschina.net 網站上傳代碼的時候不知道使用工具。我竟然一個文件一個文件復制粘貼,可費了我好大一個勁兒,

Git本地項目【轉載】

origin hub nsh blog ready tor bing lan 添加 詳細教程: http://www.cnblogs.com/specter45/p/github.html Git 提示fatal: remote origin already ex

git 文件到遠程服務器

nbsp 初始化 ima 代碼 -1 lean 總結 查看 遠程服務 當你想要上傳文件到git服務器上,需要做一下流程: 一開始走的流程是:1、本地初始化一個git庫2、關聯遠程庫 1.本地初始化一個git庫 在你要上傳的文件夾中打開命令窗口:git init;然後他會自動

git文件到網絡空間

-a pre 流程 項目 地址 con log tro javascrip 最近發現自己學知識總是容易忘記,本來學好的東西總是一不小心就給忘了,以後用到的知識還要一點點的回憶,這樣對做項目什麽的很有影響,所以我就打算每天回憶一點這樣就算忘了到時候自己翻找知

使用git本地項目到GitHub和更新

好用 .html 提交 切換 添加文件 cat nbsp ini git init    最近在玩GitHub這個基友平臺,在這裏做個總結,方便以後查閱,也可以給網友們做個參考。   一:註冊GitHub賬號和下載git。   二:在GitHub上新建個倉庫,點+號再點擊N

【轉】如何使用Git本地項目到github?(mac版)

重復 ack you 生成 是什麽 exp git init fin git add 原文鏈接:http://www.cnblogs.com/lijiayi/p/pushtogithub.html 在此假設你已經在 github 上創建好了一個項目,像這樣: 並且你已經完

Git與GitHub(利用git本地文件到GitHub上面)

add 到你 star mit gpg 輸入 ssh git add remote GitHub就是代碼倉庫(管理代碼的工具)可以共享給所有人 Git就是從GitHub上提取文件或者將本地文件上傳到GitHub的工具(等同於SVN) 利用Git上傳項目 步驟一:(用戶和郵箱