当我运行git status
时,这就是我所看到的:
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
You are in the middle of an am session.
(fix conflicts and then run "git am --continue")
(use "git am --skip" to skip this patch)
(use "git am --abort" to restore the original branch)
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: xxx
modified: xxx
modified: xxx
Untracked files:
(use "git add <file>..." to include in what will be committed)
xxx
no changes added to commit (use "git add" and/or "git commit -a")
$ git version
git version 1.9.1
那么,&#39;那个git试图告诉我以及解决它的正确方法是什么?
我不知道这是否相关,但我们使用gerrit并且所有更改都经过审核/审批流程。
答案 0 :(得分:7)
解决冲突
执行git diff
以查看是否有任何合并标记,例如:
$ git diff hello.txt
diff --cc hello.txt
index 5eb9649,379bd44..0000000
--- a/hello.txt
+++ b/hello.txt
@@@ -1,1 -1,1 +1,7 @@@
++<<<<<<< HEAD
+Hello, master change.
++||||||| merged common ancestors
++Hello, Original.
++=======
+ Hello, branch b1 change.
++>>>>>>> b1
如果没有,请尝试使用-3
选项重新申请git am
:git am -3
如果您有,请执行,例如使用kdiff3
(Windows或Linux),git mergetool --tool=kdiff3
。这将启动一个图形工具,允许您在local, base and remote
+--------------------------------+
| BASE | LOCAL | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
使用:
LOCAL
:包含当前分支上文件内容的临时文件。BASE
:包含合并公共基础的临时文件。REMOTE
:包含要合并的文件内容的临时文件。MERGED
:包含冲突标记的文件。仅当git status未报告任何未暂存的文件时,才应执行git am --continue
。
使用Git Conflict Resolution Ted Felix查看详情:它有这个方便的摘要:
- 始终将“
-3
”与“git am
”一起使用,以确保您获得冲突标记。- 使用“
git status
”和“git diff
”找出问题所在。- 通过以下任何方法解决冲突:
- 使用您喜欢的编辑器编辑每个冲突的文件。
- “
git checkout --theirs
”或“git checkout --ours
”。- “
git checkout -m
”可撤消特定文件的冲突解决方案。 (小心!)- “
git mergetool
”和适当的合并GUI工具,例如kdiff3
。- “
git add
”已解决的文件。- “
醇>git am --continue
”继续上午。
使用Git 2.17(2018年第二季度),不要忘记与git am --show-current-patch
开始你的git am会话,以便在发生冲突时更好地查看编辑路径。
请参阅“Show current git interactive rebase operation”。
答案 1 :(得分:1)
工作树中的某些文件已更改,并且在AM会话开始之前已提交(AM是一种从电子邮件中应用补丁的方法,其中电子邮件被拆分为更改和作者信息,然后作为补丁应用于存储库)
这与更改文件,提交文件,然后尝试根据旧版本在同一行中合并同一文件中的更改相同。 Git根本不知道哪个版本的更改有效,因此最终处于conflict
状态。
这些行告诉你有冲突:
You are in the middle of an am session.
(fix conflicts and then run "git am --continue")
(use "git am --skip" to skip this patch)
(use "git am --abort" to restore the original branch)
有几种方法可以解决此类冲突,所有这些冲突都是手动的。您需要一些3向合并工具(可以谷歌),它允许您比较更改并选择您想要保留的更改。 vim
编辑器AFAIK嵌入了此工具,但我从未使用它。
还有一些图形工具可以帮助您解决SourceTree等软件中的冲突,但这一切都取决于存储库的位置以及那些图形工具是否可用。
UPD:您还可以通过写入消息中的git am --abort
来恢复此AM会话更改。这会将分支恢复到AM会话开始之前的状态,从而有效地丢失补丁信息。
答案 2 :(得分:1)
让我们一个一个地看看它们的含义......
在分支主数据上你的分支在1提交之前超过'origin / master'。 (使用“git push”发布您的本地提交)
这意味着您在本地提交了一些内容但尚未与原始内容同步。
Local:您在计算机中克隆的存储库,并开始处理它。
origin:来自的主存储库,每个人都可以克隆。
你正处于上午会议中。 (修复冲突,然后运行 “git am --continue”)(使用“git am --skip”跳过此补丁)(使用 “git am --abort”恢复原始分支)
您正在制作补丁并且您遇到了冲突,您必须将事物恢复到原始状态(使用git am --abort
)或按照以下步骤解决冲突。
git status
检查状态,如果您看到文件名称(both modified
)
打开这些文件,解决冲突,保留您想要的内容并丢弃您不想要的内容。
现在点击git add file1 file2
现在是时候继续会议了
git am --continue
如果您想跳过此补丁类型
git am --skip
你有一些变化,而你正在制作补丁 它。未提交更改的更改:(使用“git add ...”to 更新将要提交的内容)(使用“git checkout - ...”来 放弃工作目录中的更改)
modified: xxx modified: xxx modified: xxx
未跟踪的文件:(使用“git add ...”包含将会包含的内容 提交)
xxx
没有更改添加到提交(使用“git add”和/或“git commit -a”)
所以这里git试图告诉你自上次提交以来更改的文件。那些旧文件,你只是在里面改变了一些东西,它将显示为修改过的。
您在未跟踪文件下看到的是那些之前未知的git,因为它们是新文件。
解决此步骤的步骤
1。)对于未跟踪的文件
1.1.) git add <filename1> <filename2> and so on...
2.)将添加的文件提交到存储库
2.1) git commit -m "Message of your choice"
注意
正如您所提到的,您正在使用审核系统(gerrit)。您可能只想将新补丁添加到现有提交而不是新提交。如果是这种情况你需要这样做
git commit --amend
3。)现在是时候推送代码了(如果你想)
git push
对于gerrit 执行此操作
git push review