10 个你希望存在的超级实用 Git 命令及其替代方案
有一个 git 命令可以做到这一点
Git 命令并不总是直观易用。如果直观的话,我们早就可以使用这 10 个命令了。它们对于完成诸如创建或重命名 git 分支、删除文件以及撤消更改等常见任务非常有用。
对于我们愿望清单中的每个 git 命令,我们都会向您展示实际存在的命令,您可以使用它们来完成相同的任务。如果您仍在学习 Git,这份列表读起来就像一个教程,值得作为速查表保存。
# 9 - git create branch:使用 git checkout 创建一个新分支
创建新分支最快的方法是直接在 git 终端上操作。这样,你就不必使用 GitHub UI(例如,如果你使用 GitHub 进行版本控制)。
这个命令其实在 git 中是存在的,只是名字不同而已—— $ git checkout
。
如何使用 git checkout 创建分支:
单行命令:$ git checkout -b <branch-name> master
-> commit-test git:(master) $ git checkout -b feature-branch master
-> commit-test git:(feature-branch) $
Git 提示:就像提交消息一样,对 git分支采用命名约定是一种最佳实践。
# 8 – git force pull:使用 git pull 覆盖本地
你发现你所做的更改似乎与上游的更改相冲突。此时,你决定覆盖你的更改而不是保留它们,于是你执行了 a 命令,$ git pull
并收到以下错误消息:
-> commit-test git:(master) $ git pull
Updating db40e41..2958dc6
error: Your local changes to the following files would be overwritten by merge:
README.md
hint: Please, commit your changes before merging.
fatal: Exiting because of unfinished merge.
如何使用 git pull 覆盖本地更改:
- 存储本地更改:
$ git stash
- 从远程拉取更改:
$ git pull
-> commit-test git:(master) $ git stash
Updating db40e41..2958dc6
Saved working directory and index state WIP on master: d8fde76 fix(API): remove ‘test’ end-point
-> commit-test git:(master) $ git pull
Auto-merging README.md
Merge made by the ‘recurive’ strategy.
README.md | 1 +
ENDPOINT.js | 3 ++–
2 files changes, 3 insertions(+), 1 deletions(-)
Git 提示:如果您想检索更改,只需执行以下操作:$ git stash apply
# 7 – git remove untracked files:从工作树中删除未跟踪的文件
当您本地的存储库副本中存在不必要的文件和目录时,您想要删除这些文件,而不是忽略它们(使用 .gitignore),您可以使用 git clean 删除所有未被 git 跟踪的文件。
如何删除未跟踪的文件和目录:
- 从试运行开始,看看哪些内容将被删除:
$ git clean -n -d
- 确定后,使用“-f”标志运行 git clean 命令:
$ git clean -f -d
-> commit-test git:(master) $ git clean -n -d
Would remove dontTrackDir/untracked_file1.py
Would remove untracked_file2.py
-> commit-test git:(master) $ git clean -f -d
Removing dontTrackDir/untracked_file1.py
Removing untracked_file2.py
Git 提示:与其取消跟踪文件,不如先使用 .gitignore文件来防止这些文件被跟踪,这是一个好的做法。
# 6 – git unstage:从索引中取消暂存文件
当您将文件 ( $ git add
) 添加到工作树时,实际上是将它们添加到暂存区域,即将它们暂存。如果您希望 Git 停止跟踪工作树中的特定文件,则需要将其从暂存文件 (.git/index) 中移除。
如何从索引中取消暂存文件:
- 保留文件但将其从索引中删除:
$ git rm --cached <file-name>
-> commit-test git:(master) $ git rm –cached unstageMe.js
rm unstageMe.js
- 要保持整个工作树不受影响,请取消暂存所有文件(清除索引):
$ git reset
-> commit-test git:(master) $ git reset
Git 提示:您还可以根据 .gitignore取消跟踪已添加到 git 存储库的文件。
# 5 – git undo merge:中止(取消)合并
有时您会遇到这样的情况(我们都遇到过这种情况),您合并了分支并意识到需要撤消合并,因为您不想发布刚刚合并的代码。
如何中止(取消)合并并维护所有提交的历史记录:
- 签出到主分支:
$ git checkout master
- 运行 git log 并获取合并提交的 id:
$ git log --oneline
- 通过提交 ID 恢复合并:
$ git revert -m 1 <merge-commit-id>
- 提交还原并将更改推送到远程仓库。你可以摆出一副扑克脸,假装“什么都没发生”。
-> commit-test git:(master) $ git log –oneline
812d761 Merge pull request #524 from datreeio/DAT-1332-resolve-installation-id
b06dee0 feat: added installation event support
8471b2b fix: get organization details from repository object
-> commit-test git:(master) $ git revert -m 1 812d761
Revert “Merge pull request #524 from datreeio/DAT-1332-resolve-installation-id”
[master 75b85db] Revert “Merge pull request #524 from datreeio/DAT-1332-resolve-installation-id”
1 file changed, 1 deletion(-)
-> commit-test git:(master) $ git commit -m “revert merge #524”
-> commit-test git:(master) $ git push
Git 提示:无需撤消合并,使用拉取请求并设置或改进代码审查流程可以降低合并错误的可能性。
# 4 – git remove file:从远程提交中删除文件
您希望删除远程的一个(或多个)文件,可能是因为它已被弃用,或者因为该文件本来就不应该存在。那么,您想知道,从远程 git 存储库删除文件的协议是什么?
如何从提交中删除文件:
- 删除您的文件:
$ git rm <file-A> <file-B> <file-C>
- 提交您的更改:
$ git commit -m "removing files"
- 将你的更改推送到 git:
$ git push
-> commit-test git:(delete-files) $ git rm deleteMe.js
rm ‘deleteMe.js’
-> commit-test git:(delete-files) $ git commit -m “removing files”
[delete-files 75e998e] removing files
1 file changed, 2 deletions(-)
delete mode 100644 deleteMe.js
-> commit-test git:(delete-files) $ git push
Git 提示:从 Git 中删除文件并不意味着它会从历史记录中删除。该文件将继续“存活”在仓库历史记录中,直到被彻底删除。
# 3 – git uncommit:撤消最后一次提交
你提交了一次提交,但现在后悔了。也许你不小心提交了机密信息(这不是个好主意),或者你想在代码更改中添加更多测试。这些都是撤销上次提交的合理理由。
如何取消(撤消)最后一次提交:
- 要保留要撤消的提交的更改:
$ git reset --soft HEAD^
- 要销毁您想要撤消的提交的更改:
$ git reset --hard HEAD^
-> commit-test git:(undo-commit) $ git commit -m “I will regret this commit”
[undo-commit a7d8ed4] I will regret this commit
1 file changed, 1 insertion(+)
-> commit-test git:(undo-commit) $ git reset –soft HEAD^
-> commit-test git:(undo-commit) $ git status
On branch undo-commit
Changes to be committed:
(use “git reset HEAD <file>…” to unstage)
modified: README.md
Git 技巧:Git预提交钩子 (pre-commit hook)是一项内置功能,可让您定义在每次提交前自动运行的脚本。使用它可以减少取消提交的需要。
# 2 – 分支之间的 git diff
当你使用多个 git 分支时,能够比较和对比同一仓库中两个不同分支之间的差异非常重要。你可以使用以下$ git diff
命令执行此操作。
如何获取两个分支之间的差异:
- 找出两个分支尖端之间的差异:
$ git diff branch_1..branch_2
- 从共同祖先提交产生两个分支之间的差异:
$ git diff branch_1...branch_2
- 比较分支之间的文件:
$ git diff branch1:file branch2:file
-> commit-test git:(diff-me) $ git diff master..diff-me
diff –git a/README.md b/README.md
index b74512d..da1e423 100644
— a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
# commit-test
-Text on “master” branch
+Text on “diff-me” branch
Git 提示:diff-so-fancy是一个很棒的开源解决方案,可以使您的差异变得易于人类阅读。
# 1 – git delete tag:从分支中删除一个标签
如果出现“有缺陷”的版本,您可能不希望有人意外使用与此标签关联的版本。最佳解决方案是删除该标签,并移除版本与其关联标签之间的关联。
如何通过从分支中删除标签来删除标签:
- 如果您要删除远程标签,并且您的远程是源,那么只需:
$ git push origin :refs/tags/<tag-name>
- 如果您还需要在本地删除标签:
$ git tag -d <tag-name>
-> commit-test git:(delete-tag) $ git push origin :refs/tags/v1.0.0
To github.com:datreeio/commit-test.git
– [deleted] v1.0.0
-> commit-test git:(delete-tag) $ git tag -d v1.0.0
Deleted tag ‘v1.0.0’ (was af4d0ea)
Git 技巧:不确定何时或为何使用标签?点击此处了解更多(TL;DR:自动发布)
# 0 – git rename branch:更改分支名称
正如我所提到的,拥有分支命名约定是一种良好的做法,应该将其作为编码规范的一部分,这对于支持 Git 工作流程的自动化尤其有用。但是,如果您在将代码推送到分支后发现分支名称不符合约定,该怎么办?别担心,您仍然可以重命名分支。
如何在创建分支后重命名分支名称:
- 签出您需要重命名的分支:
$ git checkout <old-name>
- 本地重命名分支名称:
$ git branch -m <new-name>
- 从远程删除旧分支:
$ git push origin :<old-name> <new-name>
- 将上游分支重置为新分支名称:
$ git push origin -u <new-name>
-> commit-test git:(old-name) $ git branch -m new-name
-> commit-test git:(new-name) $ git push origin :old-name new-name
Total 0 (delta 0), reused 0 (delta 0)
To github.com:datreeio/commit-test.git
– [deleted] old-name
* [new branch] new-name -> new-name
-> commit-test git:(new-name) $ git push origin -u new-name
Branch new-name set up to track remote branch new-name from origin.
Everything up-to-date
Git 技巧:想要确保所有分支名称始终遵循你的命名规范吗?设置 Git 强制执行的分支命名策略。
下一步是什么?
找到一些有用的命令了吗?你还可以为它们设置别名! @mfrata在他的评论
中 提供了与本文相关的别名——你可以向他致谢 :)
最初发布于https://datree.io/resources/git-commands
文章来源:https://dev.to/datreeio/10-insanely-useful-git-commands-you-wish-existed-and-their-alternatives-8e6