常用Git命令汇总+Git使用难点场景解决方案
Git 命令
-
git restore .
- 将文件恢复到上一次提交/撤消所有尚未提交的本地更改。 -
git restore index.html
- 仅将特定文件恢复到最近的提交/撤消该文件的所有本地/未提交的更改。 -
git reset --hard <hash code of the commit>
- 删除提交并返回到该哈希码的提交 -
git checkout <hash code of the commit> -- <path/to/file>
- 仅针对特定文件返回具有该哈希码的提交。回滚完成后,您需要创建一个新的提交。 -
git commit --amend -m 'Your message'
- 帮助重写消息 -
git revert <hash code>
- 通过为某个提交创建新的提交来帮助回滚到之前的提交。它不会像之前那样删除这些log
提交git reset
。 -
git reflog
- 这对于恢复已删除的提交/文件/更改非常有用。用于git reset <hash code of lost commit from reflog>
恢复回滚的更改。 -
git reset HEAD~2
- 帮助回滚 2 次提交并取消暂存这 2 次已删除提交中的所有更改。 -
git reset HEAD~2 --hard
- 帮助回滚 2 次提交,但永久删除这 2 次提交中的所有更改。 -
git rebase
(最有用的命令)- 在另一个基本提示之上重新应用提交。例如,git rebase master
将分支设置为主分支的尖端
使用Git时遇到的困难场景的解决方案:
1. 将已提交的更改移动到新分支:(场景:您意外地在主分支上工作)
- - 使用
git checkout -b new-feature
- - 然后使用以下命令在主服务器上回滚提交
git reset HEAD~1 --hard
:(此命令将回滚 1 个提交)
2. 存储(示例场景:您需要在新分支上工作/切换,但不在当前分支上进行提交)
关于 git stashing 的全部内容:
git stash
当您想要记录工作目录和索引的当前状态,但希望返回到干净的工作目录时使用。该命令会保存您的本地修改,并还原工作目录以匹配 HEAD 提交。-
此命令存储的修改可以用 列出
git stash list
,用 进行检查git stash show
,并用 恢复(可能在不同的提交之上)git stash apply
。不带任何参数调用git stash
等同于git stash push
。 -
git stash
- stashes/ 将更改保存在项目后面/项目的另一个目录中,并且控件移回到最后一次提交的最后一个工作副本。
- 将更改保存为草稿并返回上次提交的代码。
-
git stash push -m "Message"
- 将存储消息添加到存储列表 -
git stash list
- 在项目后台列出所有草稿变更。
提示:存储列表存储所有存储,每个存储的功能/代码都有一个唯一的索引号。最后添加的存储始终显示在顶部,索引为 0。 -
git stash apply
- 将最后存储的草稿应用到我们当前的工作目录 -
git stash apply <index number>
- 将特定的索引存储应用到我们当前的工作目录 -
git stash drop <index number>
- 将存储从具有特定索引的存储列表中删除 -
git stash pop
- 将最后的草稿更改弹回到工作目录/工作分支上,然后将该草稿从存储列表中删除 -
git stash pop <index number>
- 将具有特定索引的草稿更改弹出回工作目录/工作分支,然后将该草稿从存储列表中删除 -
git stash clear
- 清除/删除所有存储的草稿更改
最终解决方案使用存储-
- - 首先使用以下方法将所有更改添加到暂存区
git add .
git stash
- 使用命令存储更改。- - 转到您的新分支并使用命令
git stash apply
。
3. 使用 cherry-pick 将已提交的更改移动到已经存在的分支(场景:当已经存在该功能的专用分支时,您意外地在 master 上工作):
- -
git checkout feature-branch
- -
git cherry-pick <hash code of that commit on master>
- -
git checkout master
- -
git reset HEAD~1 --hard
(回滚 1 次提交)
注意:
此场景也可以使用 #2 中解释的存储方法来解决。您可以存储更改,然后使用 将这些更改应用到新分支git stash apply
。
4. 压缩提交(场景:由于错误,你做了一堆额外的提交,并且你想将提交合并为一个新的提交消息)-
git rebase -i <hash code of the commit above which all the commits need to be squashed>
- i 代表互动壁球
- 在 vim 编辑器中打开压缩功能,您可以在其中选择或压缩并更新提交消息。
5. Bisect(场景:代码中引入了一个错误,但你不知道哪个提交引入了该错误)-
- 使用二进制搜索来查找引入错误的提交。
程序-
-
git bisect start
- 开始搜索过程以查找错误的提交。 -
(可选)使用命令
git bisect good <hash-code of the commit that you are sure doesn't have the bug>
- 通常这是第一次或第二次提交,并告诉 git 从中间开始。 -
git 将开始自行检查提交,您必须测试提交并使用命令让 git 知道提交是否有错误,
git bisect good
- 如果提交没有问题git bisect bad
- 如果提交有错误。
-
给出反馈后,git 会生成一个反馈树,用于返回导致 bug 的提交/第一个错误提交,你可以复制它的哈希码。引用
refs/bisect/bad
将保留指向该提交的位置。 -
在二分会话之后,要清理二分状态并返回到原始 HEAD,请发出以下命令:
-
git bisect reset
- 默认情况下,这会将您的树返回到 git bisect start 之前签出的提交。 -
git bisect reset <commit>
- 例如,git bisect reset bisect/bad
将检出第一个错误的修订,同时git bisect reset HEAD
将让您停留在当前的二分提交,并完全避免切换提交。 -
git revert <hash-code of the bad commit>
- 用于恢复在代码中引入错误的错误提交中所做的更改。
6. 过滤分支(场景:您想要从之前的提交中删除特定文件,无论是大文件还是意外上传的任何 API 密钥)-
git filter-branch --index-filter 'git rm --cached --ignore-unmatch filepath' HEAD
- 重写包含特定文件的任何提交,同时将其从提交中删除。
- 从提交开始搜索
HEAD
。 --ignore-unmatch
如果找不到文件,则有助于避免错误。- 提交时间和其他属性保持不变,只有当找到特定文件并从该提交中删除时,提交的 SHA/Hash 才会更新。
7. 你的提交没有出现在你的 GitHub 图表中:
- 这种情况主要发生
.gitconfig
在您系统中的文件中设置的用户名或电子邮件与您的 GitHub 帐户上的用户名和电子邮件不同时。
解决方案-
git filter-branch --env-filter '
if [ "$GIT_COMMITTER_EMAIL" = "<Old Email>" ];
then
GIT_COMMITTER_NAME="<New Name>";
GIT_AUTHOR_NAME="<New Name>";
GIT_COMMITTER_EMAIL="<New Email>";
GIT_AUTHOR_EMAIL="<New Email>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
8. 将特定文件重置为 HEAD/删除添加到特定文件的新更改。
- 使用命令
git checkout HEAD -- <file-name>
将特定文件中所做的更改重置为上次提交的状态。
奖励命令-
使用 git 创建 zip 文件:
git archive --format=zip --output project.zip master
此命令将输出 master 分支的 zip 文件,并且不包含 中提到的文件.gitignore
。