- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我们有一个包含 400 多个提交的 Git 存储库,其中前几十个是大量反复试验。我们希望通过将许多提交压缩为单个提交来清理这些提交。自然, git-rebase 似乎是要走的路。我的问题是它以 merge 冲突结束,而这些冲突并不容易解决。我不明白为什么应该有任何冲突,因为我只是在压缩提交(而不是删除或重新排列)。很可能,这表明我并不完全理解 git-rebase 如何进行挤压。
这是我正在使用的脚本的修改版本:
repo_squash.sh(这是实际运行的脚本):
rm -rf repo_squash
git clone repo repo_squash
cd repo_squash/
GIT_EDITOR=../repo_squash_helper.sh git rebase --strategy theirs -i bd6a09a484b8230d0810e6689cf08a24f26f287a
if grep -q "pick " $1
then
# cp $1 ../repo_squash_history.txt
# emacs -nw $1
sed -f ../repo_squash_list.txt < $1 > $1.tmp
mv $1.tmp $1
else
if grep -q "initial import" $1
then
cp ../repo_squash_new_message1.txt $1
elif grep -q "fixing bad import" $1
then
cp ../repo_squash_new_message2.txt $1
else
emacs -nw $1
fi
fi
# Initial import
s/pick \(251a190\)/squash \1/g
# Leaving "Needed subdir" for now
# Fixing bad import
s/pick \(46c41d1\)/squash \1/g
s/pick \(5d7agf2\)/squash \1/g
s/pick \(3da63ed\)/squash \1/g
Finished one cherry-pick.
# Not currently on any branch.
nothing to commit (working directory clean)
Could not apply 66c45e2... Needed subdir
git status
产生一个干净的工作目录。如果我再做一个
git rebase --continue
,在多次提交后,我收到了非常相似的消息。如果我再做一次,我会在几十次提交后收到另一条非常相似的消息。如果我再做一次,这次它会经历大约一百次提交,并产生以下消息:
Automatic cherry-pick failed. After resolving the conflicts,
mark the corrected paths with 'git add <paths>', and
run 'git rebase --continue'
Could not apply f1de3bc... Incremental
git status
,我得到:
# Not currently on any branch.
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: repo/file_A.cpp
# modified: repo/file_B.cpp
#
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: repo/file_X.cpp
#
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: repo/file_Z.imp
rm -rf repo_squash
git clone repo repo_squash
cd repo_squash/
git rebase --strategy theirs -i bd6a09a484b8230d0810e6689cf08a24f26f287a
git rebase -i bd6a09a484b8230d0810e6689cf08a24f26f287a
#========================================================
# Initialize directories
#========================================================
rm -rf test_squash/ test_squash_clone/
mkdir -p test_squash
mkdir -p test_squash_clone
#========================================================
#========================================================
# Create repository with history
#========================================================
cd test_squash/
git init
echo "README">README
git add README
git commit -m"Initial commit: can't easily access for rebasing"
echo "Line 1">test_file.txt
git add test_file.txt
git commit -m"Created single line file"
echo "Line 2">>test_file.txt
git add test_file.txt
git commit -m"Meant for it to be two lines"
git checkout -b dev
echo Meaningful code>new_file.txt
git add new_file.txt
git commit -m"Meaningful commit"
git checkout master
echo Conflicting meaningful code>new_file.txt
git add new_file.txt
git commit -m"Conflicting meaningful commit"
# This will conflict
git merge dev
# Fixes conflict
echo Merged meaningful code>new_file.txt
git add new_file.txt
git commit -m"Merged dev with master"
cd ..
#========================================================
# Save off a clone of the repository prior to squashing
#========================================================
git clone test_squash test_squash_clone
#========================================================
#========================================================
# Do the squash
#========================================================
cd test_squash
GIT_EDITOR=../test_squash_helper.sh git rebase -i HEAD@{7}
#========================================================
#========================================================
# Show the results
#========================================================
git log
git gc
git reflog
#========================================================
# If the file has the phrase "pick " in it, assume it's the log file
if grep -q "pick " $1
then
sed -e "s/pick \(.*\) \(Meant for it to be two lines\)/squash \1 \2/g" < $1 > $1.tmp
mv $1.tmp $1
# Else, assume it's the commit message file
else
# Use our pre-canned message
echo "Created two line file" > $1
fi
最佳答案
好吧,我有足够的信心抛出一个答案。也许必须编辑它,但我相信我知道你的问题是什么。
您的玩具 repo 测试用例中有一个 merge - 更糟糕的是,它 merge 了冲突。并且您在 merge 中重新定位。无 -p
(这并不完全适用于 -i
), merge 被忽略。这意味着当 rebase 尝试挑选下一个提交时,您在冲突解决中所做的任何事情都不存在,因此它的补丁可能不适用。 (我相信这显示为 merge 冲突,因为 git cherry-pick
可以通过在原始提交、当前提交和共同祖先之间进行三向 merge 来应用补丁。)
不幸的是,正如我们在评论中指出的,-i
和 -p
(保留 merge )相处得不是很好。我知道编辑/改写有效,而重新排序则无效。但是,我相信它适用于南瓜。这没有记录,但它适用于我在下面描述的测试用例。如果您的情况更加复杂,您可能会在做自己想做的事情时遇到很多麻烦,尽管它仍然是可能的。 (故事的寓意:在 merge 之前用 rebase -i
清理。)
因此,假设我们有一个非常简单的案例,我们想将 A、B 和 C 压缩在一起:
- o - A - B - C - X - D - E - F (master)
\ /
Z -----------
git rebase -i -p
正如你所期望的那样工作。
git rebase --continue
继续前进。 (当然,您可以通过从原始 merge 提交中 check out 版本来再次解决它们。)
rerere
在您的 repo 中启用(
rerere.enabled
设置为 true),这会更容易 - git 将能够重用最初发生冲突时记录的解决方案,您所要做的就是检查它以确保它有效对,将文件添加到索引中,然后继续。 (您甚至可以更进一步,打开
rerere.autoupdate
,它会为您添加它们,因此 merge 甚至不会失败)。但是,我猜您从未启用过 rerere,因此您将不得不自己解决冲突。*
rerere-train.sh
来自 git-contrib 的脚本,它试图“从现有的 merge 提交中优先 [the] rerere 数据库” - 基本上,它检查所有 merge 提交,尝试 merge 它们,如果 merge 失败,它会获取结果并显示它们至
git-rerere
.这可能很耗时,而且我从未真正使用过它,但它可能非常有帮助。
关于git - 当我所做的只是压缩提交时,为什么 git-rebase 会给我 merge 冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3133449/
所以通常当我使用 IDA 调试时我不会遇到任何问题;然而,对于这个特定的进程(模块之前的大小为 9.9 MB),IDA 坚持每次启动该进程时都会重新设置基准,这会卡住 IDA 并迫使我在它真正启动之前
在 git rebase -i 的正常过程中看起来像这样(=> 表示终端命令提示符): => git logg * 7bec976 (HEAD -> develop, origin/develop)
我正在用几个分支尝试一些东西,所以我重新基于一个临时分支并且在解决一些冲突时我决定不以另一种方式完成重新设置它。然后我删除了涉及的临时分支并继续我的快乐方式。几个小时后,我想 rebase 另一个分支
我有一个本地分支机构,我们称它为 DEV。分支提交历史如下所示: module_A: 添加CRC校验(9273467932) module_B:更改关机程序 (84705723) merge 来自 X
是否有任何常见的 git 使用错误或一般的任何原因,如果这些冲突已在先前的 rebase 中全部解决, rebase 会重复来自先前 rebase 的冲突? 此外,rebase 是否优先于如何解决冲突
我们遇到了一个问题,如果你rebase你的分支在master之上然后push,另一个在你的分支上工作的人pull s 和 gets 各种合并冲突,因为 rebase 重写了历史并且提交与分支上的提交不
我们遇到了一个问题,如果你rebase你的分支在master之上然后push,另一个在你的分支上工作的人pull s 和 gets 各种合并冲突,因为 rebase 重写了历史并且提交与分支上的提交不
我注意到如果我做一个 git rebase -i HEAD~10 然后不要更改结果文件中的任何内容,仍然会执行某种 rebase 。 IE。我需要 git push origin branch --f
场景: 我正在与一个 20 多人的团队一起开发远程 git 存储库。经常创建、提交和 merge 分支以掌握。 我和一位同事在一个分支机构一起工作了几天。他重新定位分支,解决所有冲突并 push 。
出于某种原因,运行 git rebase 突然没有 rebase 我的整个分支,我无法想象为什么。在 rebase 之前我有以下内容: 运行 git rebase develop 后我得到的是: 请注
我的 git 分支看起来像这样: master-*-*-*-*-*-*-implement_x \ \-*-further_foo_fixes_that_dep
人们常说,您不应该对已经推送的提交进行 rebase 。那是什么意思? 最佳答案 要理解这一点,我们需要了解一下 git 的工作原理。 git 存储库是一个树结构,其中树的节点是提交。这是一个非常简单
在过去的几天里,我一直在研究使用 Git 进行 rebase 。大多数支持 rebase 的论点都说它清理了历史并使其更加线性。如果你进行普通 merge (例如),你会得到一个历史记录,显示历史记录
最近,我在更改提交消息的同时对仅限本地的存储库进行 rebase 取得了很大的成功,之后只有提交消息被更改,但历史本身没有。 现在我有了自己的存储库 - 远程和本地。我在几个分支上做了几次提交并且已经
我在我的功能分支 my-feature ,我运行 rebase develop 分支: (my-feature)$ git rebase develop 终端显示一堆冲突,在detached现在模式:
总结 在当前分支中找到还包含在任何其他分支中的最新提交的最快方法是什么? 奖励:该技术能否允许上述问题中的“任何其他分支”成为“任何其他远程分支”或“任何其他本地分支”? 背景 我喜欢使用 git r
interactive rebase 有什么不同,比如: git rebase -i HEAD~3 并且在没有 -i 的情况下 rebase : git rebase HEAD~3 最佳答案 正如 T
这是我在重新设置当前分支的基础同时防止本地分支变平时通常做的事情: git fetch origin git rebase -r origin/develop -r 是 --rebase-merges
我正在同时处理两个功能,“feature1”是“feature2”的基础。我为他们创建了两个分支;当我在 feature1 上工作时,我提交到“feature1”分支;当我在 feature2 上工作
当我读到 git-rebase 时,我知道重新设置的提交应该丢失。我说应该是因为我注意到,知道 rebased 提交 sha,我可以记忆起它。 假设我有以下三个提交 A -> B -> C C 的 s
我是一名优秀的程序员,十分优秀!