看起来像git
不会自动在文件内部合并差异,即使它们发生在不相交的区域中也是如此。恰好位于分支机构原始存储库的后面也无济于事。
这将导致以下情况: A 和 B 已克隆其存储库。 A在文件 F 中进行了一些更改,然后提交并推送了它们。 B 随后也对 F 进行了更改。当 B 尝试推送其更改时,他将不得不手动查看文件,无论更改是否相交或不相交 。 >
真的是那样吗?每个人都忍受吗?
不好意思,但是svn
做到了这一点,令我感到惊讶的是,被认为优于svn
的git无法完成svn
可以做的一些基本工作。对我来说,这是退后一步。
此外,在发生冲突的情况下,git pull
会将 B 的 F 文件置于带有diff标记的不工作状态。任何在生产区域中进行更改的工作流程(这可能是一件好事,我将在下面解释)都被这个破坏了。
比方说,我有一个存储库的两个副本-dev
和prod
-包含两行文本文件。
> 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