您现在的位置是:首页 >其他 >【Git基础】常用git命令(二)网站首页其他
【Git基础】常用git命令(二)
1. 合并commit为一个
在使用git的时候,我们可能针对同一个任务由多次提交,比如我们针对同一个feature可能由多个同事修改了不同部分,但是多个提交让我们的版本管理显得比较凌乱,此时我们可以合并多个commit为一个。
1.1 git commit --amend
它是一个用于修改最近一次提交的 Git 命令。当你想要更改最近的提交消息、添加遗漏的文件更改或者调整已经提交的文件时,可以使用这个命令。需要注意的是,这个操作会改变提交的哈希值,因此在共享的分支上使用时要小心。
- 添加遗漏的更改: 如果你意识到在最近的提交中遗漏了某些更改,可以先将遗漏的文件添加到暂存区,然后使用
git commit --amend
将它们添加到最近的提交中。例如:
这将把git add forgotten-file.txt git commit --amend --no-edit
forgotten-file.txt
添加到最近的提交中,并保留原来的提交消息(因为使用了--no-edit
选项)。 - 调整已提交的文件: 如果你想要修改已提交的文件,可以先对文件进行更改,然后将更改的文件添加到暂存区,并使用
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 合并为一个提交。你可以这样操作:
- 切换到你要修改的分支(例如 main):
git checkout main
- 使用
git rebase -i
选择要合并的提交范围。要将 C、D 和 E 合并,我们需要从 B 开始进行变基:git rebase -i B^
- 这将打开一个文本编辑器,显示类似于以下内容的提交列表:
pick C pick D pick E
- 将第二个和第三个提交(D 和 E)的操作从
pick
改为squash
(或简写为 s):pick C squash D squash E
- 保存并关闭编辑器。这将再次打开一个编辑器,让你编辑新的提交消息。创建一个合并了 C、D 和 E 的新提交消息,然后保存并关闭编辑器。
- 此时,commit 历史将变为:
F 是新的合并提交。A---B---F (main)
1.3 git reset
这种方法将撤销提交,但保留工作区的更改。然后,你可以创建一个新的提交,包含之前多个提交的更改。以相同的例子为参考:
- 切换到你要修改的分支(例如 main):
git checkout main
- 使用
git reset
命令回退到提交 B,并使用--soft
选项保留工作区更改:git reset --soft B
- 现在,使用
git commit
创建一个包含 C、D 和 E 更改的新提交。在提交时,添加一个描述性的提交消息:git commit -m "合并 C, D 和 E 的更改"
- 此时,你的 commit 历史将变为:
F 是新的合并提交。A---B---F (main)
1.4 示例
- 添加了3个commit
- 使用
git rebase -i <hash>
将最后两个pick改为squash - 编辑commit信息
我这里将下面的两个信息注释,将第一条修改为:feat:add new declaration
保存后会自动完成commit,然后再push,三个commit就合并为一个了 - 可视化
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的内容非常有用,尤其是在涉及多个分支的情况下。
例子:
假设有两个分支:master
和feature
,您想要修改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过滤
- 按日期
git log --after="2023-4-1" # 2023年4月1号之后的所有日志 git log –-before="2013-4-1" # 2023年4月1号之前的所有日志
- 按作者
git log --author="Ricky"
- 按提交信息
git log --grep=“issue” # 查看提交本中包含issue的日志
- 按文件
git log -- ./src/http/modules/ngx_http_xslt_filter_module.c
- 按内容
git log -S “ngx_free” # 查看所有文件中包含了ngx_free字符串的修改
- 按范围
git log <since>..<until>
比如 git log master…feature这可以显示出自从master分支fork之后,feature分支上所有的提交
3.9 git show [commit_id]
显示commit_id的提交内容,包括所有文件的修改信息