1. 程式人生 > >svn下衝突的含義以及遇到衝突的處理方法

svn下衝突的含義以及遇到衝突的處理方法

在專案中,基本不可避免多個人同時參與一個專案,因此就可能會出現多個人同時修改一個檔案的情況,就不可避免的會出現衝突。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中的衝突解決看起來非常的複雜,實則很簡單,只要掌握了原理,舉一反三,就可以得心應手了!

學習資料來源於:

http://www.letuknowit.com/archives/svn-conflict-resolution/

相關推薦

svn衝突含義以及遇到衝突處理方法

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

CentOS7mysql忘記root密碼的處理方法

uri mys ati pac span ble spa AS gin 1. vi /etc/my.cnf,在[mysqld]中添加 skip-grant-tables 例如: [mysqld] skip-grant-tables datadir=/var/lib/

eclipse沒有Dynamic Web Project的處理方法

dev div gen pri x86_64 orm 開發插件 add pdo eclipse版本: eclipse-java-oxygen-R-win32-x86_64.zip name=Eclipse Platform id=org.eclipse

Android事件分發機制以及滑動衝突處理

轉載請註明出處:http://blog.csdn.net/u013038616/article/details/50733811 方便日後的檢視與交流,將學習與實踐總結如下。 一、Android事件傳遞分析 1、ViewGroup中事件分發機制相關的方法 a、dispatchTo

Idea解決SVN衝突以及利用SVN更新到指定版本

1、解決衝突 當B使用者提交程式碼發生衝突後,可以再次選擇更新: 選擇OK: 彈窗如下: 如果選擇Merge…,則彈出版本差異的視窗,讓使用者自行檢視差異後再選擇以哪個版本的修改為準: 2、更新到指定版本 右鍵工程:

mzy git學習,分支衝突以及衝突解決(五)

衝突解決: 先嚐試製造衝突: 首先我:git checkout -b mzy 建立一個mzy的分支 然後在其中修改readme.txt檔案,隨便加上一點東西。 vim readme.txt   write... wq 然後: git add r

某些情況安卓引入so衝突的解決

前言 年前在做一個專案的時候,為了減小apk的大小,所以就把除了'armeabi'的so都給刪了,經測試無不良情況. 前一段時間又要改某個sdk,換了一個so庫,必須要用64位的(arm64v8a),由於專案時間長了,換了次svn地址,所以就悲劇了,專案以前的64位so都被刪了也找不回來

AndroidStudio GiT 處理衝突(兩端更新程式碼,處理程式碼衝突)

1.如果同時有不止1人修改了,專案中的同一個檔案,此時點選pull 會彈出一個訊息,提示說會 override覆蓋掉你的本地版本,此時,點選androidStudio上面的 updateProject按鈕 此時選擇: merge Using Stash 然後點選ok,會提示你有

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

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

SVN更新或提交時出現衝突該如何解決

解決版本衝突的命令。在衝突解決之後,需要使用svnresolved來告訴subversion衝突解決,這樣才能提交更新。衝突發生時,subversion會在WorkCopy中儲存所有的目標檔案版本(上次更新版本、當前獲取的版本,即別人提交的版本、自己更新的版本、

mint-UI上拉載入拉重新整理和fastclick衝突問題解決

當我們的Vue專案為了解決IOS裝置事件點選卡頓,300ms的延遲的問題,引入了fastclick後,會有很多小的衝突,例如在使用mint-UI實現上拉載入和下拉重新整理的時候,經常會觸碰到點選事件進入下一個頁面,這是因為去掉300毫秒的延遲就會使得頁面特別靈敏,想著用阻止冒泡的方式來解決。 在

git 命令 (帶圖詳情版包括程式碼衝突標籤以及合併分支)

Git Git 是目前世界上最先進的分散式版本控制系統(沒有之一) 作用 原始碼管理 好處 方便多人協同開發 方便版本控制 Git的誕生 作者是 Linux 之父:Linus Benedict Torvalds當初開發 Git 僅僅是為了輔助 Linux 核

Windows環境安裝 MySQL以及遇到的相關問題處理

這篇文章主要介紹了Windows環境下安裝MySQL遇到的問題及解決辦法 ,需要的朋友可以參考下 下載MySQL安裝包,我的是下載mysql-8.0.11-winx64,解壓到你想安裝的目錄下,然後配置環境(window環境下,mac本還沒試過) 下載地址:https://dev.mysql

雜湊表的構造方法衝突處理方法及雜湊拉鍊法的簡單程式碼實現

  由於雜湊表的查詢高效性,在平時的演算法中用的也是比較多。例如:字串、單詞個數的統計,只出現一次字元或者數字的統計,兩個集合相同元素的查詢等等,還有插入刪除的高效(鏈地址法)都可以用雜湊表來解決。所以這裡對其做一個小小的總結。缺點可能是需要佔用額外的記憶體空間。 一、雜湊

NVIDIA驅動以及開發運行環境,雙顯卡的配置Ubuntu環境的各種問題以及處理方法

安裝文件 環境 工具 config posit 指示 apt 賬戶 令行 將開源的Nouveau驅動加入黑名單,禁止其啟動; sudo vi /etc/modprobe.d/blacklist.conf 在文件

樣式的層級關係,選擇器優先順序,樣式衝突以及抽離樣式模組怎麼寫,說出思路,有無實踐經驗

1、樣式的層級關係:一個是權重,另一個就是共用樣式和私用樣式了,比如說兩個ul,它們的子元素除了背景色之外都一樣,那可以直接用li {}來定義相同的公用樣式,用 .ul_1 li {} , .ul_2 li {} 來定義不相同的樣式。可以根據元素之間的差別來選擇用哪種方法

關於Git的提交(本篇為同一分支的提交、不同分支的合併以及解決衝突方法

一、同一分支的提交 1.修改過的檔案會出現一個‘>’ 2.右鍵單擊工程檔案-Team-Commit(將修改過的檔案提交到本地倉庫) 3.如圖所示,左側為要提交到本地倉庫的檔案(預設展示所有修改過的檔案),右側可以填寫你修改了什麼,用做備註 4.將在本地

WebView加拉重新整理的時候,如果WebView內部有上下滑動的列表,會與拉重新整理的滑動衝突

WebView加下拉重新整理的時候,如果WebView內部有上下滑動的列表,會與下拉重新整理的滑動衝突,表現在WebView滑到下面就再也滑不上去了。網上查了很多解決辦法,有重寫WebView的,有重寫

SVN同步,更新,解決衝突方法

給初學者一個教程,來講一下,我們開發過程中,如何使用SVN. 如圖,我們一般都是選中專案以後,右鍵 -team-與資源庫同步 下面會跳轉到myeclipse的 同步的模式,下圖中的三個按鈕很重要,是我們同步的三個主要按鈕。 這個藍色的按鈕,在沒有衝突的前提

nginx反向代理到一個tomcat多個專案session衝突

今天公司測試伺服器遇到了一點問題測試環境在一個tomcat下部署了多個專案 通過nginx來訪問 nginx反向代理時為了能夠獲取到cookie將每個專案的cookie地址都對映到/目錄下 而專案的登入資訊是儲存到session中了 後臺將傳遞一個sessionid存到coo