Git 命令

Posted by xcTorres on March 6, 2021

git是程序员日常生活中常用的工具。本人按照平时使用的经验,认为git学习的内容分为两类。一是日常的一些基本用法,网上已经有很多不错的tutorial,如本文最后参考中的链接,本文将记录一些使用频率更高的命令。二是在生产环境中应该一个项目应该有哪些分支来进行管理,从而确保线上项目正常安全运行。

基本用法

1)修改和提交

在将所更改的文件添加到暂存区之前,可以根据如下命令确认有哪些被更新的文件。

1
2
    git status          #查看状态
    git diff            #查看变更内容 

接下来我们便可以使用add和commit的组合,add命令可以将要上传的文件加入到暂存区,而commit命令是暂存区的文件真正加入新的分支。

1
2
3
    git add .           #跟踪所有改动过的文件
    git add <file>      #跟踪指定的文件
    git commit -m"commit message"  #提交所有更新过的文件

最后使用push命令就可以把本地分支更新到远程分支了

1
    git push origin your-branch

2)撤销

这里应该区分开来,两种撤销。1是当我们把一些文件用add命令加入到暂存区但还没有commit的时候,我们可以撤销暂存区中已经添加的一些文件。2是当我们已经commit了之后,这时候只能撤销或者回退commit。

撤销暂存区 从暂存区移除特定文件,但不改变工作目录。它会取消这个文件的缓存,而不覆盖任何更改,即对该文件的修改还是存在于工作目录。

1
    git reset <file>

同样的我们也可以使用如下命令撤销暂存区的单个文件,但其也会同样覆盖工作区的文件更改。即在工作目录中的该文件已指向最近一次commit,改commit之后所做的修改都将消失。

1
    git checkout -- filename.txt

如果你使用的git版本是大于2.23.0的,则可以直接使用如下命令,其等同于git checkout命令。

1
    git restore filename.txt

重设暂存区,匹配最近的一次提交,但工作目录不变。它会取消所有文件的缓存,而不会覆盖任何修改,给你了一个重设缓存快照的机会。

1
    git reset

重设暂存区和工作目录,匹配最近的一次提交。除了取消缓存之外,–hard 标记告诉 Git 还要重写所有工作目录中的更改。换句话说:它清除了所有未提交的更改,所以在使用前确定你想扔掉你所有本地的开发。

1
    git reset --hard

将当前分支的末端移到 ,将暂存区重设到这个提交,但不改变工作目录。所有 之后的更改会保留在工作目录中,这允许你用更干净、原子性的快照重新提交项目历史。

1
    git reset <commit>

撤销commit 将当前分支的末端移到 ,将暂存区和工作目录都重设到这个提交。它不仅清除了未提交的更改,同时还清除了 之后的所有提交。

1
    git reset --hard <commit>

git revert 命令用来撤销一个已经提交的快照。但是,它是通过搞清楚如何撤销这个提交引入的更改,然后在最后加上一个撤销了更改的新提交,而不是从项目历史中移除这个提交。这避免了Git丢失项目历史,这一点对于你的版本历史和协作的可靠性来说是很重要的。

1
    git revert <commit>

3)查看提交历史

1
2
3
    git log             #查看提交历史
    git log -p <file>   #查看指定文件的提交历史
    git blame <file>    #以列表方式查看指定文件的提交历史

4)分支与标签

1
2
3
4
5
6
7
8
    git branch           #显示所有本地分支 
    git checkout <branch/tag>                    
                         #切换到指定分支或标签
    git branch  <new-branch> #创建新分支
    git branch -d <branch> #删除本地分支
    git tag              #列出所有本地标签
    git tag  <tagname>   # 基于最新提交创建标签
    git tag  -d <tagname> #删除标签

5)合并与衍合

1
2
   git merge <branch>    #合并指定分支到当前分支
   git rebase <branch>   #衍合指定分支到当前分支

6)远程操作

1
2
3
4
5
6
7
8
9
10
11
12
13
    git remote -v        #查看远程版本库信息
    git remote show <remote>
                         #查看指定远程版本库信息
    git remote add <remote> <url>
                         #添加远程版本库
    git fetch <remote>   #从远程库获取代码
    git pull <remote> <branch> 
                         #下载代码及快速合并
    git push <remote> <branch>
                         #上传代码及快速合并
    git push <remote> :<branch/tag-name>
                         #删除远程分支或标签
    git push --tags      #上传所有标签  

Git branching Model


首先有master分支和develop分支,这两个分支的生命周期是无限的。master分支大家都不陌生,它应该是一个储存处于可部署状态的最稳定代码的分支。而所有准备release的新更新的代码,不是直接合并到master,而是先合并到develop分支下,若develop分支下的所有代码都已经足够稳定且ready to be released,这时候才适合最终合并至master分支。

为了支持团队间的并行开发,还需要有一些其他分支的支持。而如下三种分支也有其各自的用途。

  • Feature branches
  • Release branches
  • Hotfix branches

Feature branches:必须从develop分支来,并最终合并到develop分支,其一般用于新开发一个新feature时所用,且可能开发时间比较长久。

Release branches:当develop合并到了足够多的feature,足以merge到master生成环境时,这时候可以生成一个release分支,其好处是标记好release版本号,标记新加的一些feature并生成快照。如此一来团队成员可以继续在develop分支上开发新的feature,而这些新feature不会加入到当前的release分支。

Hotfix branches: 顾名思义,hotfix分支是为了快速fix生产环境的bug,其直接基于master分支,而不是develop分支。一旦bug解决,其应该被同时合并至master分支以及develop分支。且master分支需要打上新的tag。

彩蛋

git-all-commands

参考

https://github.com/geeeeeeeeek/git-recipes
https://nvie.com/posts/a-successful-git-branching-model/
https://www.atlassian.com/git/tutorials/comparing-workflows/gitflow-workflow
https://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html



-->