git自动合并文件内容冲突的问题

时间:2018-11-03 22:19:37

标签: git

看起来像git不会自动在文件内部合并差异,即使它们发生在不相交的区域中也是如此。恰好位于分支机构原始存储库的后面也无济于事。

这将导致以下情况: A B 已克隆其存储库。 A在文件 F 中进行了一些更改,然后提交并推送了它们。 B 随后也对 F 进行了更改。当 B 尝试推送其更改时,他将不得不手动查看文件,无论更改是否相交或不相交 。 >

真的是那样吗?每个人都忍受吗?

不好意思,但是svn做到了这一点,令我感到惊讶的是,被认为优于svn的git无法完成svn可以做的一些基本工作。对我来说,这是退后一步。

此外,在发生冲突的情况下,git pull会将 B F 文件置于带有diff标记的不工作状态。任何在生产区域中进行更改的工作流程(这可能是一件好事,我将在下面解释)都被这个破坏了。


比方说,我有一个存储库的两个副本-devprod-包含两行文本文件。

> git init repo
Initialized empty Git repository in (...)
> cd repo
repo> printf "First line\nSecond line\n" > file.txt
repo> git add file.txt
repo> git commit -m "Added file.txt to the repo"
...
 1 file changed, 2 insertions(+)
 create mode 100644 file.txt
repo> git checkout --detach
HEAD is now at 32a4370 Added file.txt to the repo
repo> cd ..
> git clone repo dev
Cloning into 'dev'...
done.
> git clone repo prod
Cloning into 'prod'...
done.
> cd dev

在开发过程中,文件的第一行已更改。现在文件内容应如下所示:

First line v.2 
Second line

现在让我们提交更改并将其推送到存储库:

dev> git commit -a -m "Changed first line of file.txt"
...
 1 file changed, 1 insertion(+), 1 deletion(-)
dev> git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 274 bytes | 274.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /usr/home/1234ru/git-test/repo
   32a4370..15f1341  master -> master

与此同时,有一位熟练的同事可以对实际代码进行一些更改(例如,在网站的情况下,它可能正在编辑HTML模板,更改某些配置等。所有这些都以物理文件,并且应该受版本控制;如果通过“普通用户”的图形界面(例如网站的CMS控制面板)进行更改,则甚至可能根本不需要技巧,但是对{{1}却无能为力},在git副本中编辑file.txt并更改其第二行,因此该文件看起来像这样:

prod

dev> cd ../prod prod> cat file.txt First line Second line v.2 知道只更改了文件的第二行:

git

此外,它了解到更改位于主master分支的后面,并且可以快速转发:

> git diff
diff --git a/file.txt b/file.txt
index 7d91453..6a5dff7 100644
--- a/file.txt
+++ b/file.txt
@@ -1,2 +1,2 @@
 First line
-Second line
+Second line v.2

prod> git status On branch master Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded. (use "git pull" to update your local branch) Changes not staged for commit: ... modified: file.txt 能够从存储库更新工作副本,并将新的远程更改与本地更改合并。让我们看看svn会如何做:

git

所以这不是那么简单。好的,让我们尝试先提交它,然后再尝试拉出:

prod> git pull
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /usr/home/1234ru/git-test/repo
   a8c50cb..005fa7c  master     -> origin/master
Updating a8c50cb..005fa7c
error: Your local changes to the following files would be overwritten by merge:
        file.txt
Please commit your changes or stash them before you merge.
Aborting

这也不行。

https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging说:

  

与其他版本控制系统不同,Git不会尝试成为   对合并冲突解决方案过于聪明。

所以不要太聪明,一点也不聪明。最后,我没有束缚prod> git commit -a -m "Changed second line of file.txt" ... 1 file changed, 1 insertion(+), 1 deletion(-) prod> git pull Auto-merging file.txt CONFLICT (content): Merge conflict in file.txt Automatic merge failed; fix conflicts and then commit the result. > cat file.txt <<<<<<< HEAD First line Second line v.2 ======= First line v.2 Second line >>>>>>> 005fa7c932456fb64bd81ebedf2a1fd821ddb0a0 svn commit dev这两个命令,而是有了束缚和脚本编写程序(我什至还没有弄清楚)。

你们对所有这些话怎么看?


作为参考,svn update prod处理这种情况的方式。

svn

现在让我们在dev和prod工作副本中更改两个不同的行,提交来自dev的更改,并尝试使用svn update将它们合并到prod中:

> svnadmin create repo
> svn checkout file://`pwd`/repo dev
Checked out revision 0.
> cd dev
dev> printf "First line\nSecond line\n" > file.txt
dev> svn add file.txt
A         file.txt
dev> svn commit -m "Added file.txt to the repo"
Adding         file.txt
Transmitting file data .done
Committing transaction...
Committed revision 1.
dev> cd ..
> svn checkout file://`pwd`/repo prod
A    prod/file.txt
Checked out revision 1

文件内容应如下所示(第一行已更改):

> cd dev
dev> vi file.txt

现在要更改产品,不要事先更新工作副本

First line v.2
Second line

dev> svn commit -m "Changed first line of file.txt"
Sending        file.txt
Transmitting file data .done
Committing transaction...
Committed revision 2.

文件内容应如下所示(更改第二行):

dev> cd ../prod
prod> vi file.txt

现在从存储库更新产品:

First line
Second line v.2

prod> svn diff
Index: file.txt
===================================================================
--- file.txt    (revision 1)
+++ file.txt    (working copy)
@@ -1,2 +1,2 @@
 First line
-Second line
+Second line v.2

标志prod> svn up Updating '.': G file.txt Updated to revision 2. 的意思是“合并”。让我们看看里面是什么:

G

两条线都在这里。无需手工。

通勤也很顺利:

prod> cat file.txt
First line v.2
Second line v.2

0 个答案:

没有答案