底色
嗨,我正在研究一个本地功能分支.这个本地分支搞砸了许多小提交.在将分支推到遥控器之前,我想整理一下.
为此,我会做一个交互式的rebase:
git rebase -i
Run Code Online (Sandbox Code Playgroud)
到目前为止没问题.
问题
现在这里是困难的部分:在功能开发过程中,我做了几次重构,包括重命名和文件移动.重命名文件的历史记录可用,因为它们使用以下命令重命名:
git -mv
Run Code Online (Sandbox Code Playgroud)
但是当我在重命名提交之前和之后压缩提交时,历史记录就消失了,git会将更改通知为删除和添加文件.
问题是什么?
如何在不丢失文件历史记录的情况下压缩包括重命名在内的提交?
我已经将几个提交压缩成一个提交.壁球之前提交的一个提交包括调试打印和后来提交与它一起被删除删除那些打印.有没有办法恢复它们?
我已经创建了 2 个对远程dev分支的提交。我将其压缩并合并到远程master分支中。
现在,当我想继续在dev分支上工作时 - 我不知道如何正确“修复”我的分支 - 因为在从 到 创建新的拉取请求之后,dev我master得到了在先前拉取请求中被压缩的所有提交的列表。
我有这样的事情:
O ---- A ---- B ---- XY <--(master)
\
X ---- Y ---- Z <--(development)
Run Code Online (Sandbox Code Playgroud)
如何使用 commit Z from devto创建正确的拉取请求master?
我们的团队正在决定在我们的存储库中使用什么合并策略。我们正在研究压缩合并以获得干净的提交历史记录的能力。但是,如果我们想要特定提交的更多详细信息,我们希望能够查看中间更改 - 特别是被压缩的 PR 的中间提交。
通常,压缩和删除分支将删除引用日志中对这些中间提交的所有引用,并且 git 垃圾收集可以清理这些引用。然而,在查看其他存储库时,GitHub 似乎仍然保留了这些中间提交。
我们正在寻找的是确认 GitHub 是否在引用日志中保留了这些提交 ID,并且我们保证它们会保留下来。或者,告诉我们不能保证的信息也是好的。
当使用 合并分支时--squash,git 似乎不再能够确定分支是否已完全合并。如何使用现有的 git 命令快速检查这一点?
要重现,请创建一个新的 git 存储库:
$ mkdir tmp
$ cd tmp
$ git init
$ echo "bla" > ans
$ git add .
$ git commit -m "First commit"
Run Code Online (Sandbox Code Playgroud)
创建new-branch带有提交的分支:
$ git checkout -b new-branch
$ echo "blabla" >> ans
$ echo "blupp" > zwa
$ git add .
$ git commit -m "Commit on new-branch"
Run Code Online (Sandbox Code Playgroud)
创建another-branch带有提交的分支:
$ git checkout master
$ git checkout -b another-branch
$ echo "test" >> ans …Run Code Online (Sandbox Code Playgroud) 考虑以下做法:
main功能分支中分支并根据需要创建尽可能多的提交main(例如,想想 GitHub 的“压缩并合并”按钮)现在这是我感兴趣的一个用例:
feature1创建分支并在分支上工作feature2从分支的最后一次提交开始创建一个分支feature1(参见C下图中的提交)feature1到main(参见提交G)G中feature2feature2继续在分支工作换句话说,第 4 步中合并G到feature2分支中的操作如下所示:
user@host:~/repo (main)$ git checkout feature2
user@host:~/repo (feature2)$ git merge main # merge G into feature2
Run Code Online (Sandbox Code Playgroud)
通常,这种合并(请参阅提交H)会导致许多合并冲突。
如何彻底消除这些矛盾呢?
我能想到的最简单的解决方案如下(见下图):
user@host:~/repo (main)$ git checkout feature1
user@host:~/repo (feature1)$ git merge main # merge G into feature1; essentially, an empty commit
user@host:~/repo (feature1)$ git …Run Code Online (Sandbox Code Playgroud) git git-merge branching-and-merging git-squash git-merge-conflict
我已经使用将一个develop分支合并到main分支中squash merge。假设有提交 A、B、C 合并到mainfrom中develop。更改已成功合并。我可以看到分支上的挤压提交main并且文件已更新。
之后,我b-new从 中创建了一个新分支 ( )develop并将其合并到develop. 但是,当我尝试再次同步时main,develop我仍然可以看到旧的差异(提交 A、B、C)。如何解决这个问题?
清理:
develop到mainb-new到developdevelop(main我看到了旧的差异,现在陷入困境)谢谢。
我有以下情况:我曾在一个功能分支(称为work1)上工作,我对该分支有出色的 PR。当我等待 PR 获得批准时,我想开始开发一个新的功能分支(称为work2)。问题是我公司的合并策略是压缩合并到 main 中,当我尝试合并work2到main.
这几乎就是我所拥有的:
$ mkdir git_test && cd git_test && git init .
$ echo "test!" > test.txt && git add test.txt && git commit -m "added test"
[master (root-commit) 217c4bb] added test
1 file changed, 1 insertion(+)
create mode 100644 test.txt
Run Code Online (Sandbox Code Playgroud)
$ git checkout -b work1
Switched to a new branch 'work1'
$ echo "1. Added this!" >> test.txt && git add test.txt && git …Run Code Online (Sandbox Code Playgroud) 我想执行这样的事情(git squash):
git rebase -i HEAD~3
Run Code Online (Sandbox Code Playgroud)
从中提取3 git log:
git log | blabla | xargs git rebase -i HEAD~
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为xargs后面插入一个空格HEAD~.
问题是我想对这个命令进行别名,所以我不能只使用它
git rebase -i HEAD~`git log | blabla`
Run Code Online (Sandbox Code Playgroud)
因为在我定义别名时会对数字进行评估.
我不必使用xargs,我只需要一个别名(最好不是一个函数).
假设我这样做
git rebase -i HEAD~3
然后在文本编辑器中打开以下内容:
pick ae27841 Commit 1
pick fd8a71e Commit 2
pick badd490 Commit 3
Run Code Online (Sandbox Code Playgroud)
我想将这 3 个提交转换为 1 个提交,这样我就可以将该提交推送到我的存储库,然后调用拉取请求。据我了解,有两种方法可以解决此问题:
我可以保留一个提交pick并压缩其他两个。IE
pick ae27841 Commit 1
s fd8a71e Commit 2
s badd490 Commit 3
Run Code Online (Sandbox Code Playgroud)我可以删除这 3 个提交中的 2 个。IE
pick ae27841 Commit 1
Run Code Online (Sandbox Code Playgroud)这2个命令有什么区别?据我了解,每次提交都是项目的不同版本。因此我的最新提交将是我的最新版本,对吧?所以我需要保留的就是我最新的提交。由于其他 2 个提交是该项目的“旧”版本,因此我不需要它们,因此我可以删除它们。那么,方法是2将我的 3 次提交转换为 1 次提交的正确方法吗?如果是这样,我需要在什么样的情况下压缩我的提交?
这里正确的方法是什么?压缩或删除提交?
git-squash ×10
git ×9
git-merge ×3
github ×3
git-rebase ×2
git-commit ×1
linux ×1
merge ×1
recovery ×1
rename ×1
squash ×1
xargs ×1