1. 程式人生 > >SVN:衝突解決 合併別人的修改zz

SVN:衝突解決 合併別人的修改zz

在專案中,基本不可避免多個人同時參與一個專案,因此就可能會出現多個人同時修改一個檔案的情況,就不可避免的會出現衝突。svn已經很聰明瞭,如果你和別人對於同一個檔案的修改之間不存在重疊(比如你在檔案最開始增加了一行,而你同事在檔案的結尾出增加了一行),svn會自動將你們的修改進行合併,然而意外總是會發生,而且超出了svn的處理範圍,只好採用人工智慧(手工)來進行合併了。
要解決衝突,我們首先得製造個衝突,保證你現在已經有兩個工作拷貝了,我們現在修改其中的一個,例如這裡我們修改sally_calc中的main.c檔案。

[email protected]:/home/kris/sally_calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        printf("5 + 10 = %d.\n",add(5,10));
        printf("15 - 10 = %d.\n",sub(15,10));
        //sally's test
        printf("sally: 60 - 33 = %d.\n",sub(60,33));
return 0; }

在這裡sally增加了一個屬於她自己的測試語句,改好後,提交到svn

[email protected]:/home/kris/sally_calc/trunk# svn ci -m "sally add some test code"
Sending        trunk/main.c
Transmitting file data .
Committed revision 7.

下面回到kris的工作副本,做類似的修改,具體如下

[email protected]:/home/kris/calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        printf("5 + 10 = %d.\n",add(5,10));
        printf("15 - 10 = %d.\n",sub(15,10));
        //kris's test
        printf("kris: 12 + 28 = %d.\n",add(12,28));
return 0; }

好了,下面的工作自然是提交了。

[email protected]:/home/kris/calc/trunk# svn ci -m "kris add some test code"
Sending        trunk/main.c
svn: Commit failed (details follow):
svn: File '/trunk/main.c' is out of date

很抱歉,提交失敗了,原因是本地檔案過期了(因為之前sally提交了對於main.c的修改)。原來如此,趕緊把sally的修改update過來。不過在這之前提供一個檢測本地檔案是否已經過期的辦法,還記得經常用到的svn st命令吧

[email protected]:/home/kris/calc/trunk# svn st
M       main.c
[email protected]:/home/kris/calc/trunk# svn st -u
M       *        6   main.c
Status against revision:      7

看到那個*了吧,出現這個標記就說明本地副本的檔案已經過期了,需要執行svn update了。

[email protected]:/home/kris/calc/trunk# svn up
Conflict discovered in 'main.c'.
Select: (p) postpone, (df) diff-full, (e) edit,
        (mc) mine-conflict, (tc) theirs-conflict,
        (s) show all options:

額滴個小心臟啊,又出錯了,還要做選擇題,糾結啊,糾結前還是看看各個選項都是做啥的吧

(p) postpone          暫時推後處理,我可能要和那個和我衝突的傢伙商量一番
(df) diff-full        把所有的修改列出來,比比看
(e) edit              直接編輯衝突的檔案
(mc) mine-conflict    如果你很有自信可以只用你的修改,把別人的修改幹掉
(tc) theirs-conflict  底氣不足,還是用別人修改的吧
(s) show all options  顯示其他可用的命令

這裡我們先選擇p稍候處理,系統會給出如下輸出,main.c前面的C標識說明這是一個衝突中的檔案,需要手工處理以解決衝突。

        (s) show all options:p
C    main.c
Updated to revision 7.
Summary of conflicts:
  Text conflicts: 1

如果這個時候你檢視一下工作拷貝,你會發現多了幾個檔案,對於每一個衝突的檔案,svn會放置三個額外的未版本化檔案到你的工作拷貝。

[email protected]:/home/kris/calc/trunk# ls -al m*
-rw-r--r-- 1 root root 312 2012-09-20 16:35 main.c
-rw-r--r-- 1 root root 216 2012-09-20 16:35 main.c.mine
-rw-r--r-- 1 root root 156 2012-09-20 16:35 main.c.r6
-rw-r--r-- 1 root root 218 2012-09-20 16:35 main.c.r7

其中main.c.mine是融合了你的修改的版本,裡面是你更新的內容,main.c.r6是你做更新操作以前的版本,你是在這個版本的基礎上做的修改,main.c.r7是版本庫中的最新版本,這裡有別人的修改,而就是這個修改和你的修改衝突了。這幾個檔案可以自己去檢視下,應該很好理解。
對了,還有主角沒有登場,這個時候如果你看下mian.c的內容,估計你又要鬱悶了,和你原先的修改完全不一樣了。

[email protected]:/home/kris/calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        printf("5 + 10 = %d.\n",add(5,10));
        printf("15 - 10 = %d.\n",sub(15,10));
<<<<<<< .mine
        //kris's test
        printf("kris: 12 + 28 = %d.\n",add(12,28));
=======
        //sally's test
        printf("sally: 60 - 33 = %d.\n",sub(60,33));
>>>>>>> .r7
        return 0;
}

你會看到由小於號、等於號和大於號串組成的三個部分,其中小於號和等號之間的內容是你的修改,而等號和大於號之間的修改是其他人的修改,在明確了衝突的原因之後,我們已經知道怎麼修改了,兩個人的修改都是需要保留的。
OK,那就保留所有的修改,刪除掉<、=和>,最後的結果如下。
小於號、等於號和大於號串是衝突標記,並不是衝突的資料,你一定要確定這些內容在下次提交之前得到刪除。

[email protected]:/home/kris/calc/trunk# cat main.c
#include <stdio.h>
#include "add.h"
#include "sub.h"

int main()
{
        printf("5 + 10 = %d.\n",add(5,10));
        printf("15 - 10 = %d.\n",sub(15,10));
        //kris's test
        printf("kris: 12 + 28 = %d.\n",add(12,28));
        //sally's test
        printf("sally: 60 - 33 = %d.\n",sub(60,33));
        return 0;
}

衝突解決了,下面的工作就是通知svn,我們已經把衝突搞定了(使用svn resolved命令),下面該你了,可以看到svn將生成的幾個臨時檔案刪除了。

[email protected]:/home/kris/calc/trunk# svn resolved main.c
Resolved conflicted state of 'main.c'
[email protected]:/home/kris/calc/trunk# ls -al m*
-rw-r--r-- 1 root root 278 2012-09-20 17:07 main.c

接下來提交程式碼,搞定收工。

[email protected]:/home/kris/calc/trunk# svn ci -m "kris add some test code"
Sending        trunk/main.c
Transmitting file data .
Committed revision 8.

svn中的衝突解決看起來非常的複雜,實則很簡單,只要掌握了原理,舉一反三,就可以得心應手了!

相關推薦

SVN衝突解決 合併別人修改zz

在專案中,基本不可避免多個人同時參與一個專案,因此就可能會出現多個人同時修改一個檔案的情況,就不可避免的會出現衝突。svn已經很聰明瞭,如果你和別人對於同一個檔案的修改之間不存在重疊(比如你在檔案最開始增加了一行,而你同事在檔案的結尾出增加了一行),svn會自動將你們的修

SVN程式碼衝突解決方案

原文連結:https://www.cnblogs.com/dunitian/p/4333443.html 對於剛接觸svn的人來說,svn衝突後,不能提交是件讓人很鬱悶的事情。最讓人鬱悶的事,是程式碼間的覆蓋。你把我程式碼蓋了,我會很火大的。誰把誰的蓋了都不爽。 為什麼會出現程式碼

Git建立和合並分支、merge分支衝突解決、rebase分支衝突解決、臨時修改 (stash)

分支的概念: 在Git中每一次的提交,Git都會把它們串成一條時間線,這條時間線就是一個分支。 在Git裡,如果我們沒有對分支進行其他操作,預設會建立一個主分支master,我們的提交都在這個master分支上。 HEAD指標指向分支名,分支名指向提交。預設情況下,HE

SVN程式碼衝突解決方案小集合

對於剛接觸svn的人來說,svn衝突後,不能提交是件讓人很鬱悶的事情。最讓人鬱悶的事,是程式碼間的覆蓋。你把我程式碼蓋了,我會很火大的。誰把誰的蓋了都不爽。 為什麼會出現程式碼衝突問題呢,因為不同的人,同時修改了同一個檔案的同一個地方,這個時候,他提交了,你沒有提交,你就提交不了,這個時候,你要先更新,更新

SVN版本衝突解決

版本衝突原因: 假設A、B兩個使用者都在版本號為100的時候,更新了kingtuns.txt這個檔案,A使用者在修改完成之後提交kingtuns.txt到伺服器,這個時候提交成功,這個時候kingtuns.txt檔案的版本號已經變成101了。同時B使用者在版本號為100的k

SVN 版本衝突解決

環境:Visual Studio 2010外掛:問題:假設A、B兩個使用者都在版本號為10的時候,更新了NewBillFeature.cs這個檔案,A使用者在修改完成之後提交NewBillFeature

SVN版本衝突解決詳解@http://blog.csdn.net/windone0109/article/details/4857044

版本衝突原因: 假設A、B兩個使用者都在版本號為100的時候,更新了kingtuns.txt這個檔案,A使用者在修改完成之後提交kingtuns.txt到伺服器,這個時候提交成功,這個時候kingtuns.txt檔案的版本號已經變成101了。同時B使用者在版本號為100的k

SVN解決衝突(合併別人修改)

我們可以使用 svn status -u 來預測衝突,當你執行svn update一些有趣的事情發生了: $ svn update U INSTALL G README C bar.c Updated to revision 46. U和G沒必要關

GIT 分支管理建立與合併分支、解決合併衝突

建立與合併分支 首先,我們建立dev分支,然後切換到dev分支: $ git checkout -b dev Switched to a new branch 'dev' git checkout命令加上-b引數表示建立並切換,相當於以下兩條命令: $ git

git--分支管理建立、合併衝突解決

宣告:文章原稿來源於恩師稀哥。 一、概念 分支就是科幻電影裡面的平行宇宙,當你正在電腦前努力學習Git的時候,另一個你正在另一個平行宇宙裡努力學習SVN。 如果兩個平行宇宙互不干擾,那對現在的你也沒啥影響。不過,在某個時間點,兩個平行宇宙合併了,結果,你既學會了git又學會了SVN!

eclipse svn版本合併衝突解決

衝突情況的解決辦法衝突情況1:伺服器程式碼和自己程式碼改動的地方相同這種情況比較複雜,一般只能將自己的程式碼儲存一份到本地,然後直接將伺服器程式碼更新下來,然後在新的程式碼上修改自己的邏輯。就比如說你和

如何解決GitHub衝突使用命令列解決合併衝突

如何解決GitHub衝突<二>:使用命令列解決合併衝突 原文地址:https://help.github.com/desktop/guides/contributing/syncing-your-branch/ 你可以使用命令列和文字編輯器來解決“合併衝突”。

git分支的合併衝突解決

原文:   http://gitbook.liuhui998.com/3_3.htmlhttp://gitbook.liuhui998.com/5_3.html 一、如何分支的合併 在git中,可以使用git merge 和git rebase兩個命令來進行

SVN進階解決衝突,版本控制工具

什麼時候容易出現衝突? 多個人同時修改了同個檔案中的同一行程式碼 無法進行對比的二進位制檔案,比如圖片等 如何解決衝突? 例項分析 下面,我們根據實際應用場合,模擬出現衝突,到如何通過SVN提供的Edit Conflicts 介面,通過顏色標識和操作按鈕,快速準確地合併

CentOS7安裝SVN+httpd訪問(解決老是登入不上,許可權不夠的問題)

1. 安裝svnserve 安裝svnserve服務: $ sudo yum install subversion 2. 安裝httpd 安裝httpd服務: $ sudo yum install httpd 3. 安裝mod_dav_svn mod_dav_svn

分支管理~解決合併衝突(十)

生活總是這樣,那樣,反正不是你想的那樣。合併分支往往也不是一帆風順的。 1、在分支上修改、新增、提交: 準備新的 feature1分支,繼續我們的新分支 feature1 實踐開發,如下: 我們在資料夾 gitSkills 目錄下,將 readme.txt 檔案 裡最後一行的內容新

BOS開啟單據的時候出現無法解決 equal to 運算中 "Chinese_PRC_CS_AS" 和 "Chinese_PRC_CI_AS" 之間的排序規則衝突

導致這個錯誤的原因是:對應BOS查詢的這個單據,你手動新增了一個欄位沒有進行釋出,而直接到資料庫裡面對它進行了新增了一個欄位,或者新增了一個表,而它們對應的排序規則沒有繼承資料庫的預設排序規則:Chinese_PRC_CS_AS,所以你需要對這個欄位,或者這個表進行排序規則轉換如: alter

svn報錯解決Previous operation has not finished; run 'cleanup' if it was interrupted

背景,在更新專案的時候,更新一半突然出現了error,隨後重新更新,結果出現了下面的錯誤 專案上的svn圖示也不見了。 試了刪專案也沒用,在任何一級目錄操作均報此問題; 上網查瞭解決辦法,挺複雜,確沒效果,比如在專案.svn目錄下各種操作,都沒起作用,結果,專案上點

GIT : 記錄IntelliJ IDEA 合併衝突時的一個bug(衝突解決後代碼和本地倉庫一樣時導致merge失敗)

IntelliJ IDEA版本 IntelliJ IDEA 2017.1.4 x64 1 問題描述 我們在用git開發是經常遇到衝突的情況,一般發生在協同開發時,一個檔案被兩個人同時改掉了,這是我們在pull程式碼時要解決衝突,並重新add然後commit最後push.

一次關於log4j的jar包衝突解決Caused by: java.lang.NoSuchFieldError: fileName

專案中log系統使用的 logback + slf4j 實現, 今天一同事新引入幾個jar包,結果tomcat啟動時報了以下異常: Caused by: org.springframework.beans.factory.BeanCreationException: Error creati