- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我通常的功能/错误分支工作流程是这样的:
假设无法单击 PR 上的 merge 按钮,因为我的功能分支现在与 master 有冲突。在这一点上,我通常想解决与 master 的冲突,并且我想在我的功能分支上这样做,以便我可以让正在审查我的代码的人看到:
但是,我可能不想 rebase ,因为代码审查已经在进行中(有时我无论如何都会 rebase ,但其他时候我想避免它)。
我怎样才能可靠、高效地使用 git 来实现这一目标?
我目前所做的是这些事情的混合:
git merge master
;(查看哪个文件有冲突,然后 git annotate 以找到相关提交);git reset --hard origin/my-feature-branch
; git cherry-pick <some commit>
(或者可能手动进行一些更改);(重复))有时这不起作用,因为冲突是空的,所以我不知道要注释什么才能找到正确的提交。 编辑:事实上,在空冲突的情况下,我想它是没有 merge 或 rebase 就不可能解决(但在其他情况下是可能的——见下面的例子)。
当它确实起作用时,似乎 git 可以帮助我以更自动化的方式完成大量工作。
我试过了 git-imerge
另外——这似乎并不是专门为此目的而设计的,它也以未处理的异常退出。
这是一个具体的工作示例,因为这里的答案存在怀疑,有时可以像我在这里描述的那样解决分支上的冲突而无需 merge 或 rebase (请注意,这并没有显示上面工作流程的每个步骤,并仅演示“在没有 merge 或 rebase 的情况下解决分支上的冲突”部分):
$ mkdir -p conflict-example/upstream
$ cd conflict-example/upstream
$ git init .
Initialised empty Git repository in /tmp/conflict-example/upstream/.git/
$ echo 'changed_only_upstream before' > changed_only_upstream
$ echo 'changed_only_downstream before' > changed_only_downstream
$ echo 'changed_in_both before' > changed_in_both
$ git add .
$ git commit -m 'initial'
[master (root-commit) 23040ea] initial
3 files changed, 3 insertions(+)
create mode 100644 changed_in_both
create mode 100644 changed_only_downstream
create mode 100644 changed_only_upstream
$ cd ..
$ git clone upstream downstream
Cloning into 'downstream'...
done.
$ cd downstream
$ git checkout -b downstream
Switched to a new branch 'downstream'
$ vim changed_in_both
$ vim changed_only_downstream
$ cat changed_in_both
changed_in_both before
downstream
$ cat changed_only_downstream
changed_only_downstream before
downstream
$ git commit -am 'downstream'
[downstream 6ead47f] downstream
2 files changed, 2 insertions(+)
$ cd ../upstream
$ vim changed_in_both
$ vim changed_only_upstream
$ cat changed_in_both
changed_in_both before
upstream
$ cat changed_only_upstream
changed_only_upstream before
upstream
$ git commit -m 'upstream conflict' changed_in_both
[master e9ec7c5] upstream conflict
1 file changed, 1 insertion(+)
$ git commit -m 'upstream non-conflict' changed_only_upstream
[master d4057e0] upstream non-conflict
1 file changed, 1 insertion(+)
$ cd ../downstream/
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git pull
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From /tmp/conflict-example/upstream
23040ea..d4057e0 master -> origin/master
Updating 23040ea..d4057e0
Fast-forward
changed_in_both | 1 +
changed_only_upstream | 1 +
2 files changed, 2 insertions(+)
$ git checkout downstream
Switched to branch 'downstream'
$ git merge master
Auto-merging changed_in_both
CONFLICT (content): Merge conflict in changed_in_both
Recorded preimage for 'changed_in_both'
Automatic merge failed; fix conflicts and then commit the result.
$ git merge --abort
$ git log --all --graph --pretty=oneline --abbrev-commit --decorate
* d4057e0 (origin/master, origin/HEAD, master) upstream non-conflict
* e9ec7c5 upstream conflict
| * 6ead47f (HEAD -> downstream) downstream
|/
* 23040ea initial
$ git cherry-pick e9ec7c5
error: could not apply e9ec7c5... upstream conflict
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
$ vim changed_in_both
$ cat changed_in_both
changed_in_both before
upstream
$ git add changed_in_both
$ git commit
Recorded resolution for 'changed_in_both'.
[downstream 7a4f7a7] upstream conflict
Date: Sat Aug 27 14:41:13 2016 +0100
1 file changed, 1 insertion(+), 1 deletion(-)
$ git log --all --graph --pretty=oneline --abbrev-commit --decorate
* 7a4f7a7 (HEAD -> downstream) upstream conflict
* 6ead47f downstream
| * d4057e0 (origin/master, origin/HEAD, master) upstream non-conflict
| * e9ec7c5 upstream conflict
|/
* 23040ea initial
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ git merge downstream
Merge made by the 'recursive' strategy.
changed_only_downstream | 1 +
1 file changed, 1 insertion(+)
$ git log --all --graph --pretty=oneline --abbrev-commit --decorate
* c036d60 (HEAD -> master) Merge branch 'downstream'
|\
| * 7a4f7a7 (downstream) upstream conflict
| * 6ead47f downstream
* | d4057e0 (origin/master, origin/HEAD) upstream non-conflict
* | e9ec7c5 upstream conflict
|/
* 23040ea initial
我相信如果我在 cherry-pick 中选择了不同的分辨率,我将无法使用该 merge 命令进行 merge (这至少类似于 github merge 按钮所做的)。在那些情况下,通常我要么自己进行 merge ,要么进行 rebase ——但这不是这个问题的目的(尽管如果有某种方法可以实现 merge 按钮的可点击性,而无需在这些情况下 merge master 或 rebase ,那会很有趣听说!)。
最佳答案
这是一个bash完成这项工作的脚本:
#!/bin/bash
declare -a conflicts
echo "Detecting conflicts..."
for rev in `git rev-list HEAD..master`
do
git cherry-pick --no-commit $rev > /dev/null 2>&1
if [ $? -eq 1 ]
then
conflicts+=($rev)
fi
git reset --hard HEAD > /dev/null
done
for rev in ${conflicts[*]}
do
git cherry-pick --no-commit $rev > /dev/null 2>&1
echo "Commit $rev cherry-picked."
read -p "Resolve conflicts, then press any key to continue: "
done
echo "Done cherry-picking! Commit your changes now!"
运行此脚本,每次出现提示时,解决文本编辑器中的任何冲突,然后从另一个窗口执行 git add
。完成后,您可以 git commit
(根据提示)。
到目前为止,在我的测试中,我发现这个脚本有两个问题:
当我将功能分支 merge 回 master
时,我遇到了一些小冲突。如果从 master
merge 到功能分支,这些冲突要小得多。事实上,您可以这样做:
git checkout master
git merge --no-ff feature/my-feature -x theirs
它应该可以工作。但是,这可能意味着 GitHub Merge 按钮不起作用,而且我认为没有办法告诉 GitHub 使用 -x theirs
。
我不确定这是否仅取决于所做的相对更改,所以这可能只是由我的特定测试 repo 引起的问题。
如果您有依赖于 aaa
的提交 bbb
,都在 master
上,然后是 bbb 的
将被检测为冲突。我的测试表明,无论您是在 cherry-pick
cherry-pick
中保留这样的更改还是丢弃它都没有关系。 (它似乎也不会影响问题 #1。)
我正在寻找这两个问题的解决方案,但这应该足以让您入门。
关于git - 如何在不 merge 或 rebase 的情况下解决分支上的 git 冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39151523/
我从一个 Mercurial 存储库开始,它有多个我试图 merge 到其中的子存储库,就好像它们一直是主存储库的一部分一样。它们从一开始就不应该是子存储库。 我整理了一个将旧历史转换为单个存储库的过
假设我有一个主线分支和一个功能分支。我已经多次将主线分支 merge 到功能分支中,但只有少数非常小的 merge 冲突。我想清理历史,以便最后只有一个 merge 。执行此操作的最佳方法是什么? 最
首先我使用heapq.merge创建了a&b的两个结果,但是在mergea&b之后,我发现a的列表是空的。 >>> a=merge([1,2],[3,4]) >>> b=merge([4,5],[6,
我和我的团队正在使用远离主轨道 (origin/dev) 的远程分支 (origin/our_feature_branch) 开发一项功能。 Gerrit用于审查等。 使用 git merge ori
这个问题在这里已经有了答案: Is there a way to merge with Strategy "ours" without producing a new commit? (1 个回答)
GitLab 无法自动 merge 请求。所有 merge 请求都会收到消息“此 merge 请求包含必须解决的 merge 冲突。您可以在命令行上手动尝试” 消息似乎不正确,我通过使用“git br
git 有没有办法在不 merge 文件的情况下 merge 两个分支?换句话说就是绘制 merge 箭头。 假设我有分支 A 和 B。我需要将分支 B merge 到 A,但不需要 B 中的所有更改
我想使用提供 git 集成的流行的开源问题跟踪器 (Redmine)。不幸的是,跟踪器中的每个项目只能与一个 git repo 相关联。在跟踪器中创建多个项目不是我理想的设置。 考虑到这一点,我尝试使
在我们的存储库中,我们遵循基于 git-flow 的工作流程。我们有一个已完成的发布(安装在生产环境中),因此发布分支已 merge 到主分支中。 B---C---D---E [release
git merge 命令有一个执行快进 merge 的选项,但这不是我想要的,因为如果它不能执行快进 merge ,它会使用普通 merge . 是否有一个 git 命令仅执行快进 merge (从跟
尝试合并 TFS2008 时出现此错误。源分支或目标分支上都没有挂起的更改。 TF14083: The item {0} has a pending merge from the current me
为了更好地理解这些操作,我想知道 github 或 gitlab 到底是如何 merge 这些请求的。当压缩、 rebase 、 merge ......时详细执行哪些 git 命令? 最佳答案 PR
为了更好地理解这些操作,我想知道 github 或 gitlab 到底是如何 merge 这些请求的。当压缩、 rebase 、 merge ......时详细执行哪些 git 命令? 最佳答案 PR
我试图将提交的一部分从默认分支(不是所有文件和其他文件的部分) merge 到一个命名分支。我试过 graft ,但它只需要整个提交,而没有给我选择的机会。这将如何完成? 例子: A---B---C-
我正在进行 merge ,此时我已准备好提交,但我在 TortoiseHg 中的提交对话框显示许多文件已修改,但是当我与 parent 进行比较时,它说所有文件都是二进制相等的。 我没有也从未有过 e
我已经尝试了以下几种变体,但我仍然遇到错误。有什么办法可以解决这个问题。 DB2 10.1(DB2 for z/OS V10) 对于以下 MERGE INTO TRGT t USING SRC s O
我的数据库模型有用户和 MAC 地址。一个用户可以有多个MAC地址,但一个MAC只能属于一个用户。如果某个用户设置了他的 MAC,并且该 MAC 已经链接到另一个用户,则现有关系将被删除,并在新所有者
假设我有一个新功能,所以我创建了一个新分支。这个分支是一个会持续很长时间的副项目,所以我最终将 master merge 回它以使其保持最新状态。这已经发生了 50 次,因为我一直在更新它并消除该功能
过去几个小时我在 Mercurial 中进行了一次巨大的 merge 。 merge 131 个文件后,我的 merge 工具 meld 崩溃,显示 python 回溯。在尝试退出 meld 时,我无
我有一个关于 git merge 的问题。假设我的存储库中有两个分支(本地和远程):master 和 test。当我在测试分支上工作时,主分支被其他人更新了。在终端中,我写: git checkout
我是一名优秀的程序员,十分优秀!