981377660LMT / ts

ts学习
6 stars 1 forks source link

git merge --squash #634

Open 981377660LMT opened 2 weeks ago

981377660LMT commented 2 weeks ago

git merge --squash命令的作用是将一个分支的多次提交历史压缩成一次提交合并到当前分支。这样做的好处是可以保持项目历史的整洁,因为它只会在目标分支上创建一个新的提交来表示合并的更改,而不是将所有的提交历史都合并过来。

具体来说,当你执行git merge --squash feature-branch时,Git会:

  1. feature-branch分支上的所有更改作为一个整体计算出来,就像这些更改是一次性完成的一样。
  2. 然后,它会将这些更改应用到当前分支上,但是不会立即创建提交。相反,这些更改会被暂存(就像执行git add命令一样),等待你手动提交。
  3. 你需要执行git commit来完成合并,这时你可以编辑提交信息,以准确反映这次合并的内容。

使用git merge --squash的场景包括:

需要注意的是,使用git merge --squash后,原分支的提交历史不会出现在目标分支的历史中,这意味着一些详细的历史信息(如每次提交的作者、具体的提交时间等)会丢失。

981377660LMT commented 2 weeks ago

好的,让我们通过一个详细的例子来说明git merge --squash的使用:

假设我们有一个主分支main和一个特性分支feature-loginfeature-login分支上有多个提交,用于实现登录功能。

  1. 首先,查看当前分支状态:
$ git branch
* main
  feature-login
  1. 查看feature-login分支的提交历史:
$ git log feature-login --oneline
abc1234 Add password reset functionality
def5678 Implement user authentication
ghi9101 Create login form
jkl1121 Initial login page setup
  1. 现在,我们想要将feature-login分支合并到main分支,但希望将所有更改压缩为一个提交。切换到main分支并执行squash合并:
$ git checkout main
$ git merge --squash feature-login
  1. 此时,Git会将feature-login分支的所有更改应用到main分支,但不会自动创建提交。你可以查看状态:
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   login.html
        new file:   login.js
        modified:   index.html
  1. 现在,你可以创建一个新的提交来包含所有这些更改:
$ git commit -m "Implement login feature"
  1. 查看main分支的提交历史:
$ git log --oneline
abcdef0 Implement login feature
fedcba9 Previous commit on main

在这个例子中,feature-login分支的四个提交被压缩成了main分支上的一个提交。这样可以保持主分支的历史简洁,同时仍然包含了所有的功能更改。

注意事项: