您现在的位置是:首页 >其他 >【Git基础】常用git命令(二)网站首页其他

【Git基础】常用git命令(二)

Ricky_0528 2023-05-30 20:00:02
简介【Git基础】常用git命令(二)

1. 合并commit为一个

在使用git的时候,我们可能针对同一个任务由多次提交,比如我们针对同一个feature可能由多个同事修改了不同部分,但是多个提交让我们的版本管理显得比较凌乱,此时我们可以合并多个commit为一个。

1.1 git commit --amend

它是一个用于修改最近一次提交的 Git 命令。当你想要更改最近的提交消息、添加遗漏的文件更改或者调整已经提交的文件时,可以使用这个命令。需要注意的是,这个操作会改变提交的哈希值,因此在共享的分支上使用时要小心。

  1. 添加遗漏的更改: 如果你意识到在最近的提交中遗漏了某些更改,可以先将遗漏的文件添加到暂存区,然后使用git commit --amend将它们添加到最近的提交中。例如:
    git add forgotten-file.txt
    git commit --amend --no-edit
    
    这将把forgotten-file.txt添加到最近的提交中,并保留原来的提交消息(因为使用了--no-edit选项)。
  2. 调整已提交的文件: 如果你想要修改已提交的文件,可以先对文件进行更改,然后将更改的文件添加到暂存区,并使用git commit --amend将它们合并到最近的提交中:
    # 对文件进行更改
    git add modified-file.txt
    git commit --amend --no-edit
    
    这将把modified-file.txt的更改添加到最近的提交中,并保留原来的提交消息,这就相当于合并了本次提交跟上一次提交,并且是保留上一次提交的消息。

请注意,git commit --amend命令会创建一个新的提交对象并替换原来的提交。这意味着提交哈希值会发生变化。在与他人共享的分支上执行此操作时要谨慎,因为它可能导致分支历史的不一致。

1.2 git rebase -i

这种方法使用 Git 的交互式变基功能(interactive rebase),允许你修改 commit 历史。以以下 commit 历史为例:

A---B---C---D---E  (main)

假设你想要将提交 C、D 和 E 合并为一个提交。你可以这样操作:

  1. 切换到你要修改的分支(例如 main):
    git checkout main
    
  2. 使用git rebase -i选择要合并的提交范围。要将 C、D 和 E 合并,我们需要从 B 开始进行变基:
    git rebase -i B^
    
  3. 这将打开一个文本编辑器,显示类似于以下内容的提交列表:
    pick C
    pick D
    pick E
    
  4. 将第二个和第三个提交(D 和 E)的操作从pick改为squash(或简写为 s):
    pick C
    squash D
    squash E
    
  5. 保存并关闭编辑器。这将再次打开一个编辑器,让你编辑新的提交消息。创建一个合并了 C、D 和 E 的新提交消息,然后保存并关闭编辑器。
  6. 此时,commit 历史将变为:
    A---B---F  (main)
    
    F 是新的合并提交。

1.3 git reset

这种方法将撤销提交,但保留工作区的更改。然后,你可以创建一个新的提交,包含之前多个提交的更改。以相同的例子为参考:

  1. 切换到你要修改的分支(例如 main):
    git checkout main
    
  2. 使用git reset命令回退到提交 B,并使用--soft选项保留工作区更改:
    git reset --soft B
    
  3. 现在,使用git commit创建一个包含 C、D 和 E 更改的新提交。在提交时,添加一个描述性的提交消息:
    git commit -m "合并 C, D 和 E 的更改"
    
  4. 此时,你的 commit 历史将变为:
    A---B---F  (main)
    
    F 是新的合并提交。

1.4 示例

  1. 添加了3个commit
    在这里插入图片描述
  2. 使用git rebase -i <hash>
    在这里插入图片描述
    将最后两个pick改为squash
  3. 编辑commit信息
    在这里插入图片描述
    我这里将下面的两个信息注释,将第一条修改为:feat:add new declaration
    保存后会自动完成commit,然后再push,三个commit就合并为一个了
  4. 可视化
    在这里插入图片描述

2. 修改commit的内容

2.1 git commit --amend

git commit --amend命令允许你修改最近一次的commit。这将使用当前的暂存区作为新的提交内容。如果暂存区没有任何改动,这个命令可以用来修改commit信息。

举个例子:
假设刚刚提交了一个commit,但是发现有个文件忘记添加了。可以按照以下步骤操作:

git add forgotten_file.txt
git commit --amend

接下来会打开一个文本编辑器,可以在其中修改commit信息。保存并关闭编辑器后,新的commit将替换之前的commit。
在这里插入图片描述

2.2 git rebase -i

git rebase -i命令允许你在一个交互式界面中修改过去的多个commits。您可以修改提交顺序、合并、拆分以及编辑提交信息。

一个例子:
假设你想修改倒数第三个commit,可以按照以下步骤操作:

git rebase -i HEAD~3

这将显示一个类似以下内容的列表:

pick f392171 Commit message 1
pick 58a9d84 Commit message 2
pick b6a0f7c Commit message 3

将您想要修改的commit行前的pick改为edit,然后保存并关闭文件。例如,我们想修改第二个commit:

pick f392171 Commit message 1
edit 58a9d84 Commit message 2
pick b6a0f7c Commit message 3

现在,Git将回滚到第二个commit。您可以进行任何修改,例如添加、删除或修改文件。完成后,将更改添加到暂存区:

git add modified_file.txt

然后,运行git commit --amend修改提交信息。完成后,继续rebase过程:

git rebase --continue

如果在rebase过程中遇到冲突,需要解决冲突,将解决冲突后的文件添加到暂存区,然后继续rebase过程。

如果在rebase过程中遇到冲突,需要解决冲突,将解决冲突后的文件添加到暂存区,然后继续rebase过程。

2.3 git cherry-pick

git cherry-pick命令可以将一个分支上的特定commit应用到另一个分支。这对于修改特定commit的内容非常有用,尤其是在涉及多个分支的情况下。

例子:
假设有两个分支:masterfeature,您想要修改feature分支上的某个commit。可以按照以下步骤操作:

首先,检查feature分支上的commit历史并找到要修改的commit(例如,a123456)。然后在master分支上创建一个新分支:

git checkout master
git checkout -b temp

接下来,使用git cherry-pick命令将要修改的commit应用到新分支:

git cherry-pick a123456

现在,可以修改该commit的内容。完成修改后,将更改添加到暂存区,并使用git commit --amend修改提交信息。最后,将修改后的commit合并回feature分支:

git checkout feature
git merge temp

最后,删除临时分支:

git branch -d temp

2.4 git reflog和git reset

在某些情况下,您可能需要恢复因操作不当而丢失的commit。git reflog可以帮助您找到这些丢失的commit。git reset命令可以用于将分支指针重置为某个特定的commit。

例子:
假设您不小心使用git push --force覆盖了远程分支,导致一些commit丢失。首先,使用git reflog查找丢失的commit:

git reflog

找到丢失的commit的哈希值(例如,b123456),然后使用git reset将分支指针重置为该commit:

git reset b123456

这样,您就可以恢复丢失的commit,并根据需要进行修改。

请注意,这些操作可能会导致分支历史改变,所以在共享分支上执行这些操作时要谨慎。同时,为了防止不必要的问题,请在执行这些操作前备份你的仓库。

3. 查看commit内容

3.1 git log

不带任何参数的版本
在这里插入图片描述

3.2 git log --oneline

每条日志仅显示在一行中
在这里插入图片描述

3.3 git log -[length]

只显示前面的length条日志
在这里插入图片描述

3.4 git log --skip=[skip]

跳过前面的skip条日志,可以和上面的-[length]联合使用
在这里插入图片描述

3.5 git log -p

显示一些统计信息以及文件的改动内容和行信息
在这里插入图片描述

3.6 git log --stat

显示提交的作者、日期、message和文件内容统计信息
在这里插入图片描述

3.7 git shortlog

显示每个author提交commit和多少条commit
在这里插入图片描述

3.8过滤

  1. 按日期
    git log --after="2023-4-1" # 2023年4月1号之后的所有日志
    git log –-before="2013-4-1" # 2023年4月1号之前的所有日志
    
  2. 按作者
    git log --author="Ricky"
    
  3. 按提交信息
    git log --grep=“issue” # 查看提交本中包含issue的日志
    
  4. 按文件
    git log -- ./src/http/modules/ngx_http_xslt_filter_module.c
    
  5. 按内容
    git log -S “ngx_free” # 查看所有文件中包含了ngx_free字符串的修改
    
  6. 按范围
    git log <since>..<until>
    

比如 git log master…feature这可以显示出自从master分支fork之后,feature分支上所有的提交

3.9 git show [commit_id]

显示commit_id的提交内容,包括所有文件的修改信息
在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。