[译] 我没法想象没有 Git 别名的的场景

我没法想象没有 Git 别名的的场景

你们看到个人 Git 工做流时,老是充满了惊讶与好奇:前端

个人 Git 工做流

个人 Git 工做流android

我对别名的热爱,始于我初次下载 zsh 和它的 oh-my-zsh 套件。它包含大量针对不一样命令行程序的预约义别名和帮助函数。我马上便喜欢上了这种取代常规的那些很长的参数化调用的输入概念。由于我最常使用的工具是 Git,因此它是我开始别名变革的首选目标。几年以后的如今,我没法想象使用 Git 自带的那些原始 git 命令。ios

固然,Git 自己就拥有完美的别名自定义系统。对我来讲,我只是不喜欢 git 和别名之间的空白。Shell 别名也很灵活而且还能够用于其余命令行,例如 dockergit

下面你会找到我使用最多的别名列表。其中一些直接源自于 oh-my-zsh,其余一些是我本身创造的。我喜欢大家至少能够找到一些有用的!若是你想亲自尝试全部的这些方法,能够从个人仓库下载。github

1. 咱们从这个库开始吧!

alias gcl = git clonedocker

这可能不是 Git 用户最常使用的命令,但我我的但愿尽快让大家掌握这些使人生畏的 GitHub 项目,就像我所但愿的那样。后端

2. 从远程仓库获取分支最新动态

alias gf = git fetch安全

我一般使用 fetch 来获取远程仓库的最新更改,由于它不会以任何形式影响工做目录的 HEAD。以后我会使用其余命令来显式修改本地文件。bash

3. 咱们查看一下其余分支!

alias gco = git checkout编辑器

对于平常开发来讲,这无疑是最有用的命令之一。我决定写这篇文章的缘由之一就是发现你们每次在他们想要切换分支时,仍然须要使用 git checkout

4. 回退到以前的分支状态!

gco -

这个破折号是一个小把戏,意思是“之前的分支”。我知道严格意义上,它不算是别名,但它太过有用以致于不得不提。并且,我印象中没有多少人知道它。

checkout 不是接受破折号的惟一选项 —— 你也能够在其余地方使用,好比 mergecherry-pickrebase

5. 快速切换至 master 分支

alias gcm = git checkout master

若是咱们常常在一些有明肯定义的的分支之间进行切换,那么咱们为何不使其尽量简单一些呢?根据你的工做流,你也能够找出其余类似的有用别名:gcd (develop)、gcu (uat)、gcs (stable)。

6. 我在哪?发生了什么?

alias gst = git status

简单明了。

7. 我不在乎当前工做变化,只要从源分支给我最新的状态就行!

alias ggrh = git reset --hard origin/$(current_branch)

个人我的最爱。有多少次你制造了如此严重的混乱,以致于你只想让暂存区和工做目录恢复到原来的状态?如今只剩下四个按键了。

请注意,这个特定的命令将当前分支重置为来源于 origin 分支的最新提交。这正是一般最须要的,但可能不是须要的东西。每当我不关心本地更改时,我都会使用它,我只但愿个人当前分支可以反映对应的远程分支。你可能会说你可使用 git pull 替带,但我只是不喜欢它会试图合并远程分支,而不仅是将当前分支重置为远程分支。

注意 current_branch 是一个自定义函数(由 oh-my-zsh 做者建立)。你能够在这里看到它。

8. 当前的更改是什么?

alias gd = git diff

有一个典型示例。它只是显示了全部的改变,但并无分阶段。若是要查看已经进行的更改,请使用此版本:

alias gdc = git diff --cached

9. 让咱们提交那些更改的文件!

alias gca = git commit -a

这会提交全部的更改文件,所以你不须要手动添加它们。可是,若是有一些还没有提交的新文件,显然须要显式地说明它们:

alias ga = git add

10. 我想在先前的提交中添加一些更改!

alias gca! = git commit -a --amend

我常用它,由于我喜欢保持 Git 历史记录的整洁(没有 “pull request fixs” 或者 “forgot to add this file” 类型的提交信息)。它只需简单接受全部的更改并将他们添加到上一次提交中。

11. 我以前的分支作的太快,那么怎么“撤销”一个文件?

gfr() {
    git reset @~ "$@" && git commit --amend --no-edit
}
复制代码

这是一个函数,不是别名,乍看好像有些复杂。它获取要“取消提交”的文件名称,从 HEAD 提交中删除对该文件所作的全部更改,但将其保留在工做目录中。而后,它会准备分阶段提交,也许是做为一个独立提交。这就是它在实践中的工做方式:

grf 示例

12. 好的,准备推送!

alias ggpush = git push origin $(current_branch)

我每次想推送的时候,都会使用这个。由于它是隐式传递远程分支参数,因此我能够确保只推送一个分支,而无须在乎 push.default 设置。从 Git 2.0 开始,它会成为默认行为,可是别名为我提供了额外的安全保证,以防我使用一些 Git 遗留的版本问题。

对于正常的推送,这可能并不那么重要,但对于下一个命令来讲,这很是关键。

13. 我已经准备推送了,并且我知道我在作什么

alias ggpushf = git push --force-with-lease origin $(current_branch)

强制推送显然是一个有争议的习惯,许多人会说你永远不该该这样作。我赞成,但只有涉及到分享像 master 这样的分支时才会有问题。

正如我说起的,我喜欢保持个人 git 历史干净。这有时涉及更改已经被推送的提交。这时,--force-with-lease 就会特别有用,由于当你的本地仓库没有更新到远程分支的最新状态时,它会拒绝推送。所以,它不可能抛弃别人的修改,至少不会在无心中抛弃。

在个人同事有一次错误地调用了 git commit -f(将 push.default 设置为 matching)以后,我开始使用这个别名,将远程分支部分名称设置为 $(current_branch),并强制推送全部的本地分支到 origin 分支。包括一个旧版本的 master,当他意识到发生了什么以后,我仍然记得他眼中的恐慌。

14. 哇,推送被拒绝了!有人动了个人分支!

你试图将你的分支推送到远程仓库,但获得了一下信息:

To gitlab.com:mjkonarski/my-repo.git
 ! [rejected]        my-branch -> my-branch (non-fast-forward)
error: failed to push some refs to 'git@gitlab.com:mjkonarski/my-repo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again. 
复制代码

当多我的同时在一个分支上工做时,就会发生这种状况。也许你的同事在你不知情的状况下,又推送了一个修改?或者你用了两台电脑,同步了以前的分支?一下是一个简单的解决方案:

alias glr = git pull --rebase

它会自动拉取最新的修改,而后将你的提交 rebase 到他们的顶部。若是你足够幸运(而且对不一样的文件进行了远程修改),你甚至能够避免解决冲突。哇,又要从新推送!

15. 我想用本身的分支来映射主分支的最新变化!

假设你有一个分支是不久以前从 master 分支建立的。你已经推送了一些改变,但同时也更新了 master 自己。如今,你但愿你的分支能够反映那些最新的提交内容。在这种状况下,相比 merge,我更喜欢 rebase —— 你的提交历史保持保持简短和清晰。就像打字同样简单:

alias grbiom = git rebase --interactive origin/master

我常用这个命令,所以这个别名是我最开始使用的第一批命令之一。--interactive 启用了你最爱的编辑器,并容许你快速检查即将基于 master 提交的提交列表。你也能够利用这个机会来 squashreword 或者 reorder 提交。所以有许多简单别名能够选择!

16. emmm,我尝试了 rebase,但出现了严重的冲突!救命啊!

没有人喜欢这些信息:

CONFLICT (content): Merge conflict in my_file.md

Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
复制代码

有时,你可能只想停止整个进程,以后再解决冲突。以上信息是如何处理的线索,但为何须要这么多按键呢?

alias grba = git rebase --abort

咱们又安全了。当你终于鼓起勇气再次进行合并解决这些冲突时,在 git add 以后,你只需继续进行 rebase 输入便可:

alias grbc = git rebase --continue

17. 请把这些变化暂时搁浅!

假设你已经作了一些改变,但尚未提交它们。如今你想快速切换到另外一个分支,并执行一些无关的工做:

alias gsta = git stash

这个提交将你的修改放在一边,并恢复至 HEAD 的干净状态。

18. 如今,开始回退!

当你完成了与你无关的工做时,你可能会快速回退你的修改:

alias gstp = git stash pop

19. 这个小提交,看起来很棒,让咱们把它放到本身的分支上!

Git 有一个叫作 cherry-pick 的优秀功能。你可使用它来将任何现有提交添加到当前分支的顶部。它就像使用这个别名同样简单:

alias gcp = git cherry-pick

这固然会致使冲突,固然这也取决于你提交的内容。解决这个冲突与解决 rebase 冲突的方法彻底同样。所以,咱们也有相似的选择来停止以及继续选择分支:

alias gcpa = git cherry-pick --abort

alias gcpc = git cherry-pick --continue


以上列表确定没有涵盖全部 git 用例。我想鼓励你把它看做是创建你本身的化名套件的良好开端。在平常工做流程中寻求可能的改进是一个好主意。

你能够在个人 Github 仓库看到这些别名(甚至更多)。

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索