标签: git-squash

Git squash提交重命名文件(保存历史记录)

底色

嗨,我正在研究一个本地功能分支.这个本地分支搞砸了许多小提交.在将分支推到遥控器之前,我想整理一下.

为此,我会做一个交互式的rebase:

git rebase -i
Run Code Online (Sandbox Code Playgroud)

到目前为止没问题.

问题

现在这里是困难的部分:在功能开发过程中,我做了几次重构,包括重命名和文件移动.重命名文件的历史记录可用,因为它们使用以下命令重命名:

git -mv
Run Code Online (Sandbox Code Playgroud)

但是当我在重命名提交之前和之后压缩提交时,历史记录就消失了,git会将更改通知为删除和添加文件.

问题是什么?

如何在不丢失文件历史记录的情况下压缩包括重命名在内的提交?

git rename git-rebase squash git-squash

7
推荐指数
1
解决办法
1407
查看次数

Git - 在壁球后恢复中间提交

我已经将几个提交压缩成一个提交.壁球之前提交的一个提交包括调试打印和后来提交与它一起被删除删除那些打印.有没有办法恢复它们?

git recovery git-squash

7
推荐指数
1
解决办法
2491
查看次数

压扁后如何修复我的 git 分支是 master Behind dev

我已经创建了 2 个对远程dev分支的提交。我将其压缩并合并到远程master分支中。

现在,当我想继续在dev分支上工作时 - 我不知道如何正确“修复”我的分支 - 因为在从 到 创建新的拉取请求之后,devmaster得到了在先前拉取请求中被压缩的所有提交的列表。

我有这样的事情:

O ---- A ---- B ---- XY <--(master)
 \
  X ---- Y ---- Z <--(development)
Run Code Online (Sandbox Code Playgroud)

如何使用 commit Z from devto创建正确的拉取请求master

git git-squash

7
推荐指数
1
解决办法
939
查看次数

GitHub 是否会无限期保留合并 PR 的提交历史记录?

我们的团队正在决定在我们的存储库中使用什么合并策略。我们正在研究压缩合并以获得干净的提交历史记录的能力。但是,如果我们想要特定提交的更多详细信息,我们希望能够查看中间更改 - 特别是被压缩的 PR 的中间提交。

通常,压缩和删除分支将删除引用日志中对这些中间提交的所有引用,并且 git 垃圾收集可以清理这些引用。然而,在查看其他存储库时,GitHub 似乎仍然保留了这些中间提交。

我们正在寻找的是确认 GitHub 是否在引用日志中保留了这些提交 ID,并且我们保证它们会保留下来。或者,告诉我们不能保证的信息也是好的。

github git-commit git-squash

7
推荐指数
1
解决办法
1393
查看次数

如何判断 git 分支在压缩后是否已完全合并

当使用 合并分支时--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)

git merge git-squash

7
推荐指数
2
解决办法
1981
查看次数

将压缩的提交从主分支合并到功能分支时避免 git 中的冲突

考虑以下做法:

  • 开发人员从main功能分支中分支并根据需要创建尽可能多的提交
  • 一旦功能完成,所有提交都会被压缩并合并到分支中main(例如,想想 GitHub 的“压缩并合并”按钮)

现在这是我感兴趣的一个用例:

  1. feature1创建分支并在分支上工作
  2. feature2从分支的最后一次提交开始创建一个分支feature1(参见C下图中的提交)
  3. 挤压并合并feature1main(参见提交G
  4. 将这个新创建的提交合并到分支Gfeature2
  5. feature2继续在分支工作

换句话说,第 4 步中合并Gfeature2分支中的操作如下所示:

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

7
推荐指数
1
解决办法
1062
查看次数

仍然比较合并后的承诺差异

我已经使用将一个develop分支合并到main分支中squash merge。假设有提交 A、B、C 合并到mainfrom中develop。更改已成功合并。我可以看到分支上的挤压提交main并且文件已更新。

之后,我b-new从 中创建了一个新分支 ( )develop并将其合并到develop. 但是,当我尝试再次同步时maindevelop我仍然可以看到旧的差异(提交 A、B、C)。如何解决这个问题?

清理:

  • PR #1:将提交 A、B、C 合并developmain
  • PR #2:合并b-newdevelop
  • PR #3:再次合并developmain我看到了旧的差异,现在陷入困境)
  • 未经 1 批准,我无法直接将更改推送到 main
  • 这些更改不会影响其他人,因此无需担心。

谢谢。

git github git-merge branching-and-merging git-squash

7
推荐指数
1
解决办法
2253
查看次数

从功能分支分支并在主南瓜合并后协调提交

我有以下情况:我曾在一个功能分支(称为work1)上工作,我对该分支有出色的 PR。当我等待 PR 获得批准时,我想开始开发一个新的功能分支(称为work2)。问题是我公司的合并策略是压缩合并到 main 中,当我尝试合并work2main.

这几乎就是我所拥有的:

  1. 创建存储库和文件:
$ 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)
  1. 通过几次提交创建第一个功能分支:
$ 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 version-control git-merge git-squash git-merge-conflict

7
推荐指数
1
解决办法
1021
查看次数

参数之前没有空格的xargs(或其他)

我想执行这样的事情(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,我只需要一个别名(最好不是一个函数).

linux git xargs git-squash

6
推荐指数
1
解决办法
2337
查看次数

git 中压缩和删除提交有什么区别?

假设我这样做

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 个提交,这样我就可以将该提交推送到我的存储库,然后调用拉取请求。据我了解,有两种方法可以解决此问题:

  1. 我可以保留一个提交pick并压缩其他两个。IE

    pick ae27841 Commit 1 
    s fd8a71e Commit 2
    s badd490 Commit 3
    
    Run Code Online (Sandbox Code Playgroud)
  2. 我可以删除这 3 个提交中的 2 个。IE

    pick ae27841 Commit 1 
    
    Run Code Online (Sandbox Code Playgroud)

这2个命令有什么区别?据我了解,每次提交都是项目的不同版本。因此我的最新提交将是我的最新版本,对吧?所以我需要保留的就是我最新的提交。由于其他 2 个提交是该项目的“旧”版本,因此我不需要它们,因此我可以删除它们。那么,方法是2将我的 3 次提交转换为 1 次提交的正确方法吗?如果是这样,我需要在什么样的情况下压缩我的提交?

这里正确的方法是什么?压缩或删除提交?

git github git-rebase git-squash

6
推荐指数
2
解决办法
3985
查看次数