git 使用进阶指南

git 是作为一名程序员必不可少的工具。它能帮助你更好的管理你的代码。既保证了你的代码不丢失,又能保证能够第一时间获取到其他同事更新的代码。这两个作用我认为是 git 在我们的日常工作中最重要的能力。写这篇文章是想记录自己从一个只会 git pull & git push 的小白变成能够熟练使用 git 各种命令的老鸟😋。

本文是一个进阶命令的收集,因此阅读前请先掌握 git 的基本知识和常见命令。

ok,废话不多说,👇就开始骚操作吧。

🎁Case :假设leader让你做一点点bugFix, 但是仓库中还有一些自己的其他改动怎么办?

1
git stash -> Stash the changes in a dirty working directory away

想想一下,自己工作干的好好的,repo管理的井井有条,这时候突然接到一个临时的更新需求。任务需要把当前目录的一些文件做修改并且提交,这时候应该怎么办呢?总不能撤回自己辛辛苦苦码的代码然后再提交吧?一个一个的手动提交修改的文件又太麻烦。这时候 git stash 命令就可以派上用场了。

这个命令的作用是把我们的一些修改隐藏在一个dirty的目录中。这个不难理解,就像是有一个盒子可以把我们的修改藏起来,等我们把这个目录需要做的改动提交之后再把我们的东西拿出来就可以了。与它配合的命令就是

1
git stash pop  // 取出我们stash的change

有了这两个命令我们就可以随便的让我们的长期工作流临时工作流不打架了。提交临时的修改时只需要stash一下我们之前的工作就可以了。

🎁Case: git 命令太长了怎么办?一个字都懒得输

1
git Aliases -> 就像配置你的mac快捷键一样配置git

在我们使用mac或者linux的时候,配置Aliases是一个很方便的技巧,我们可以把自己很常用的命令用几个很简单的字母代替。同样的,git 也可以把常用的命令都设置几个简短的字母。

1
2
3
4
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

比如👆设置的status命令, 我们现在只需要使用 git st 就可以实现原来相同的功能了。对于懒癌晚期患者来说,这个技能简直是必不可少的了。通过这个技巧,我们还可以把原来很长的操作变短,用一个方便记的短语来代替。

1
git config --global alias.unstage 'reset HEAD~1'

通过这个设置我们就可以简化reset命令, 输入 git unstage 就可以撤回我们刚刚 commit 的内容。

🎁Case: 文件夹中有太多的untrack文件怎么办?一键干掉!

1
git clean -> 将所有没有追踪的文件都给清除掉

有时候文件夹中出现了莫名其妙的文件,而是自己确定不需要的文件,那么在将需要的新文件add之后就可以大胆的使用 git clean 命令啦,把烦人的文件统统干掉,不留痕迹。

需要注意的是 clean 命令只能清除 untrack 类型的文件

🎁Case: 项目中的文件不想要了,直接删掉可以嘛?

答案当然是不可以的,如果直接通过系统删除掉文件,那么git 是不会接受到通知的,那git的树目录中自然也会保留着那个文件的一席之地。如果你不想让这个文件一直出现在你的视野中的话,那么请使用git命令来删除它。

1
git rm  -> 通过git命令删除掉文件

如果你只是单纯的想给文件改名或者移动它,那么最好也请使用git的命令。

1
git mv -> 移动文件

git rm 和 git mv 其实是跟linux命令没什么区别的,只是前面都加了一个git,只要在平时留意即可。

🎁Case: 平时项目开发,到底怎么样比较安全?

既然要保证自己的开发与别人的流程不冲突,那么切分支是必然的。保证自己的开发在一个分支,而平时的push 和 pull 在 master 分支就可以最大程度的与其他人分离开。如果为了方便的话,那么只需要开一个feature分支就可以了,平时不断的进行 master 分支和 feature 分支的合并就可以把自己的工作合并进主分支。

step 1: 新建 feature分支并切换

1
git checkout -b feature

step2: Work

1
2
3
do somethiing
git add *
git commit -m 'f1'

step3: 回到 master 分支更新最新的代码

1
2
git checkout master
git pull --rebase

step4: 切换回 feature 分支并rebase master

1
2
git checkout feature
git rebase master

step5: 切换回 master 合并 feature 分支并 push

1
2
3
git checkout master
git merge feature
git push

以上⬆️的步骤虽然是有点啰嗦,但应该是比较标准的开发流程了。如果想保证自己的开发工作不出现意外的话,最好还是不要省掉这些步骤,以免出现不必要的麻烦。

🎁Case: commit 提交的 message 写错了咋办?加个参数就可以搞定!

1
git commit --amend -m 'true message'

--amend 顾名思义就是修改的意思,通过使用这个参数来进行一次 commit 实际上是对上一次 commit 的修改,也就是说如果你没有任何操作,仅仅是重新提交一次,那么你的新的message 就会覆盖掉上一次commit 的 message, 本质上这还是属于同一个message。

当然,这个参数可不仅仅是修改下 message 这么简单的操作,如果你还想在本次 commit 中追加一些其他的改动,那么你只需要按照正常的步骤使用 git add 将这部分文件提交的 stage 后,重新进行一次 commit, 并且只需要在这个时候hexo 使用--amend命令来进行提交,就可以把上次的 commit 和上次的 commit 进行合并。因此这个功能还是非常实用的。

🎁Case: 如果我提交错了,那么该咋撤回呢?

1
git reset --mixed / --soft / --hard

git reset 命令可以让我们的仓库发生一次时光倒流,仓库中的文件回到什么状态取决于你想让他回到哪里,只要你确定了需要最后回到的位置,那么就只需要在上面👆的命令后面加上对应commit 的 hash值前几位即可,或者是用相对位置 HEAD~3这样类型的形式也是可以的。

那么你列出来的--mixed --soft --hard 这三个参数又是啥意思呢?其实这个只是对应让我们的仓库回到不同的文件状态,因为在一个commit之前我们的文件也是会经历很多变化的。具体经过的状态变化可以看👇

1
git commit 1 -> 状态1  -> 修改文件 -> 状态2 -> git add * -> 状态3 -> git commit 2

在两次 commit 之中,其实我们的文件状态会经历三次变化,那么上面对应的三个参数也就是对应了回到不同的状态位置。 在完成了 git commit 2 之后, 如果只是使用git reset命令,那么 默认的是 –mixed,该值会把我们的文件系统会到 状态2, 如果是配置了参数--soft ,那么文件系统会恢复到状态3, 而如果想彻彻底底的把上一次commit的东西给完全删除掉,不留任何痕迹,那么就可以使用--hard,这样就可以恢复到状态1。需要注意的是,如果在这一次的修改中存在新建的文件,那么即使是使用命令-- hard也不会将它删除,需要手动的再使用一次git clean来清除才可以。

1
2
3
git reset HEAD^  ->  状态2
git reset --soft HEAD^ -> 状态3
git reset --hard HEAD^ -> 状态1

🎁Case: 如果某个文件想从远程服务器删除,但是本地还要保留咋办?

1
2
3
git rm --cached filename # 使文件变成untracked状态
git commit "xxxx"
git push

前面我们已经讲过使用 git rm命令的作用是删除掉仓库中的某个文件,它不仅仅是从我们的本地仓库中删除了,还会直接在文件目录中删除这个文件。而如果我们单纯只是想要从仓库的 working directory 中删除这个文件,那么就可以添加--cached参数。

执行git rm --cached filename 这个命令后,这个文件就会变成untracked的状态,这时候重新commit并且push,那么我们的本地和远程仓库中也就不存在这个文件了。

(Still not Finish……)

0%