大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

Git 在项目中的实际使用指南

  • 每日一图

版权声明:本文为 stone 原创文章,可以随意转载,但必须在明确位置注明出处!!!

点击查看 Git 官方文档介绍

1.前话

网上关于 Git 安装使用的文章已经数不胜数,但是却鲜有将常用的 Git 指令放入实际项目中具体分析介绍。官方对指令的介绍相信没人会看不懂(就算英文不太好,Google 翻译后还是能看懂的),更多的是缺少在实际项目中的使用经验,我发现我周围的一些朋友对 Git 的操作都是处在有点迷茫的状态,所以决定用我拙劣的文笔写这篇文章献给我亲爱的朋友们,希望对他们能有点帮助,另外自己也能查缺补漏。

2.笔者的一点点建议

其实关于 Git 有很多图形化的软件可以操作,但是我强烈建议大家从命令行开始学习理解,我知道没接触过命令行的人可能会很抵触,但是我的亲身实践证明,只有一开始学习命令行,之后你对 Git 的每一步操作才能理解其意义,而等你熟练之后你想用任何的图形化的软件去操作完全没问题。

在上个公司,CTO 教我们全是基于命令行的,事后证明我们现在已经深深爱上命令行无法自拔,我们很理解 Git 每一步操作的具体含义,以致于在实际项目很少犯错,所以我这里也是基于命令行去介绍使用。

本文暂不打算介绍 Git 的安装使用,需要请自行 Google。

3.Git 具体命令

下面一步步开始介绍 Git 的常用命令使用。
我们随便输入一个命令 git status,得到如下结果:


意思就是当前目录还不是一个 Git 仓库

一、初始化和提交

$ git init

这时候我们使用到了第一个命令,代表初始化 git 仓库。输入 git init 后会有如下提示:

$ git status 【常用】

可以用来查看仓库的状态,这是一个很有用的命令,以后的开发中,使用最多的可能就是这个命令了,建议开发过程中没事就 git status 一下。


表示 readme.md 文件还没被跟踪,意思就是还没添加到 Git 仓库中。

$ git add xxx

xxx 代表文件名,表示将该文件添加到暂存区。在上一步中,就提示我们文件还没有被提交到仓库里。输入 git add readme.md,然后 git status 一下。

可以看到,文件颜色改变(我这里将 terminal 的默认样式改变了,颜色有变化就行),并且提示文字已经改变,大概是文件需要 commit ,从缓存区提交到仓库中(add 只是将文件改变保存到暂存区,所以系统提示可以使用 git rm --cached xxx 将文件从暂存区移除)。

$ git add . 【常用】

git add xxx 只是提交某个文件,而 git add . 则是把所有已更改(或新建)文件添加到缓存区。平时大可用 git add . 一次性添加所有已更改文件到缓存区。

$ git commit -m "xxx" 【常用】

commit 是提交的意思(add 只是将文件改变保存到暂存区,commit 将暂存区中文件提交到本地仓库),-m 代表是提交信息,"xxx" 表示提交的内容说明,一般不能为空,最好是写详细一点,说明你本次提交主要做了哪些修改(方便你的伙伴和你自己更好的追溯版本)。

$ git commit -am "xxx" 【常用】

其实是将上面两个步骤 add 和 commit 合二为一。


可以看到打印台提示:没有什么可以提交,工作目录很干净,意思就是没有任何修改。

二、日志的显示

$ git log 【比较常用】

查看提交日志,我们输入后看看结果:(按 ctrl + z 退出)

三、创建和切换分支

$ git branch xxx (创建一个新的分支)【常用】

创建一个新的分支(比如在 master 分支 git branch test,test 新分支的代码是和 master 一致的),输入 git branch test:


我们可以使用 git branch 来查看本地的当前分支情况,可以看到 test 分支创建成功。

$ git checkout xxx【常用】

切换到 xxx 分支,输入git checkout test:


已经切换到 test 分支。

$ git checkout -b xxx 【比较常用】

相当于一次性执行了 git branch xxx 和 git checkout xxx 两条指令,创建一个分支并且切换过去。喜欢直接的朋友可以常使用。

四、查看分支

$ git branch (查看本地分支)【常用】

查看本地分支

$ git branch -a (查看本地和远程分支)【比较常用】

不仅能看到本地分支,还能看到远程的分支分布,远程分支前面带有 remotes/origin/

到目前为止都是本地仓库的操作,实际开发中都是需要将代码提交更新到远程仓库的,别急,接下来看看怎么提交到远程,并且开辟新分支等操作。

五、将代码提交到远程和下拉到本地

$ git push origin xxx 【常用】

将本地代码提交到远程,xxx 代表对应的版本号,比如想 push 到 master 分支,git push origin master,控制台输入看看效果:


...提示没有链接到远程仓库,具体的操作步骤可以看看这篇文章【关于项目托管上传到 github 你需要知道的知识】,将代码部署到 github,其他代码管理平台也是类似的。链接成功后如下,成功提交到远程仓库:

如果其他协同合作的小伙伴将代码提交到远程了,那远程代码就发生变化了,此时想 push 是 push 不上去的,我们必须先将远程代码拉下来更新到本地。

$ git fetch origin xxx【比较常用】

xxx 需要和当前所在分支对应,比如你现在在 master 分支,则使用 git fetch origin master 将远程代码下拉到本地,此时本地的代码不会发生变化,只是相当于存储到了一个暂存区。


可以去看看,此时本地的代码并没有发生变化。

$ git merge FETCH_HEAD【比较常用】

FETCH_HEAD 表示某个 branch 在服务器上的最新状态。git merge FETCH_HEAD 用于将刚刚 fetch 下来的代码合并到本地。


此时本地代码已经合并了远程代码。

但下面这个指令在平时项目开发中用的更多。

$ git pull origin xxx【常用】

将远程代码下拉到本地并进行合并,等价于 fetch 和 merge 两步一起执行。

六、合并分支

$ git merge

很多时候,我们需要从主分支开辟一个新分支去完成某些功能,比如我们新建了一个 module 分支

在 moudule 分支上一顿操作后功能完成了,很开心,倍儿爽,这时候我们要把新功能合并回主分支,我们可以这么做:

  • 切换回 master 分支
  • merge module 分支
  • 我这里 module 分支的代码没有做任何改变,所以提示 Already up-to-date.
$ git merge --no-ff -m "merge width no-ff" dev

--no-ff 参数 表示禁用 Fast forward,本次合并要创建一个新的commit,这样也算是一次提交

然后我们可以使用 git log --graph --pretty=oneline --abbrev-commit 来查看此时的日志,如果直接使用 git merge,log 日志中是看不到 merge 信息的。

七、删除分支

$ git branch -D xxx 【比较常用】

删除本地分支, 比如我们删除 test 分支,输入 git branch -D test。

  • 需要一提的是,比如你当前处于 test 分支, 然后你在 test 分支执行删除 test 分支操作,是会报错的:
  • 我们需要先切换到非需删除分支,比如先切换到 master 主分支,然后再执行删除操作
$ git push origin --delete xxx【比较常用】

删除远程分支

  • 温馨提示:谨慎使用
  • git branch -a 可以查看远程分支分布
  • 我们先将本地 module 分支提交到远程

八、版本回滚

$ git reset --hard xxx 【不太常用】

有的时候当前代码发生了不可解决的错误等一些意外情况,在没有办法的情况下,我们可以考虑回滚到最近提交的上一次状态(可以指定回滚到某个提交的版本,通过)。

  • git log 查看 commit id (ctrl + z 退出)
  • 从上图中可以看到有两次提交,我们回滚到第一次提交的状态
  • 此时 git log,只剩一条记录

万一我又后悔了,想回到第二次提交的版本,怎么办,难道没有办法回去了吗?
git 提供了一个命令 git reflog,它会记录所有HEAD的历史,也就是说当你做 reset,checkout 等操作的时候,这些操作会被记录在 reflog 中。

我们 git reset --hard 6d8949a 就可以回到第二次提交时的状态

具体可以查看自己代码的变化来确认一下。

九、拉取并切换到远程指定分支

有时候可能有这种情况,你接触的项目已经有很多个分支了,你在第一次 clone 时,默认会是 master 主分支,但是远程最新的代码可能在 module 分支,你需要切换过去可以使用(注明:这种方式是在合并当前分支的基础上,拉取并切换到远程新分支的)

  • ① git checkout -b module + git pull origin module
  • ② git checkout -b module origin/module (创建、切换、拉取、合并一步到胃)

也有另外一种情况,比如当前分支有问题了,例如 master 本地分支有问题了,远程 master 分支也有 bug,此时 我们想拉取远程 module 分支代码并切换过去,但是显然我们不想要合并 master 分支,因为 master 分支是有问题的,我们可以这样:

  • git fetch origin module 将代码拉取到本地,但是记住此时是没有 merge 的
  • 然后 git checkout -t origin/module,此时本地 module 分支的代码和远程一致,并且不会合并本地 master 分支的代码。

十、查看变化

$ git diff

查看文件具体更改

后话:

  • 在每次 push 和 pull 之前,我们最好是 git branch 一下,查看我们当前处于哪一个分支,这样可以避免不必要的提交出错
  • 多使用 git status 命令
  • 文笔拙劣,理解有限,难免存在不足,望指出和理解

贴上一份 git 命令大全:

git init                                                  # 初始化本地git仓库(创建新仓库)
git config --global user.name "xxx"                       # 配置用户名
git config --global user.email "xxx@xxx.com"              # 配置邮件
git config --global color.ui true                         # git status等命令自动着色
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto
git config --global --unset http.proxy                    # remove  proxy configuration on git
git clone git+ssh://git@192.168.53.168/VT.git             # clone远程仓库
git status                                                # 查看当前版本状态(是否修改)
git add xyz                                               # 添加xyz文件至index
git add .                                                 # 增加当前子目录下所有更改过的文件至index
git commit -m 'xxx'                                       # 提交
git commit --amend -m 'xxx'                               # 合并上一次提交(用于反复修改)
git commit -am 'xxx'                                      # 将add和commit合为一步
git rm xxx                                                # 删除index中的文件
git rm -r *                                               # 递归删除
git log                                                   # 显示提交日志
git log -1                                                # 显示1行日志 -n为n行
git log -5
git log --stat                                            # 显示提交日志及相关变动文件
git log -p -m
git show dfb02e6e4f2f7b573337763e5c0013802e392818         # 显示某个提交的详细内容
git show dfb02                                            # 可只用commitid的前几位
git show HEAD                                             # 显示HEAD提交日志
git show HEAD^                                            # 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本
git tag                                                   # 显示已存在的tag
git tag -a v2.0 -m 'xxx'                                  # 增加v2.0的tag
git show v2.0                                             # 显示v2.0的日志及详细内容
git log v2.0                                              # 显示v2.0的日志
git diff                                                  # 显示所有未添加至index的变更
git diff --cached                                         # 显示所有已添加index但还未commit的变更
git diff HEAD^                                            # 比较与上一个版本的差异
git diff HEAD -- ./lib                                    # 比较与HEAD版本lib目录的差异
git diff origin/master..master                            # 比较远程分支master上有本地分支master上没有的
git diff origin/master..master --stat                     # 只显示差异的文件,不显示具体内容
git remote add origin git+ssh://git@192.168.53.168/VT.git # 增加远程定义(用于push/pull/fetch)
git branch                                                # 显示本地分支
git branch --contains 50089                               # 显示包含提交50089的分支
git branch -a                                             # 显示所有分支
git branch -r                                             # 显示所有原创分支
git branch --merged                                       # 显示所有已合并到当前分支的分支
git branch --no-merged                                    # 显示所有未合并到当前分支的分支
git branch -m master master_copy                          # 本地分支改名
git checkout -b master_copy                               # 从当前分支创建新分支master_copy并检出
git checkout -b master master_copy                        # 上面的完整版
git checkout features/performance                         # 检出已存在的features/performance分支
git checkout --track hotfixes/BJVEP933                    # 检出远程分支hotfixes/BJVEP933并创建本地跟踪分支
git checkout v2.0                                         # 检出版本v2.0
git checkout -b devel origin/develop                      # 从远程分支develop创建新本地分支devel并检出
git checkout -- README                                    # 检出head版本的README文件(可用于修改错误回退)
git merge origin/master                                   # 合并远程master分支至当前分支
git cherry-pick ff44785404a8e                             # 合并提交ff44785404a8e的修改
git push origin master                                    # 将当前分支push到远程master分支
git push origin :hotfixes/BJVEP933                        # 删除远程仓库的hotfixes/BJVEP933分支
git push --tags                                           # 把所有tag推送到远程仓库
git fetch                                                 # 获取所有远程分支(不更新本地分支,另需merge)
git fetch --prune                                         # 获取所有原创分支并清除服务器上已删掉的分支
git pull origin master                                    # 获取远程分支master并merge到当前分支
git mv README README2                                     # 重命名文件README为README2
git reset --hard HEAD                                     # 将当前版本重置为HEAD(通常用于merge失败回退)
git rebase
git branch -d hotfixes/BJVEP933                           # 删除分支hotfixes/BJVEP933(本分支修改已合并到其他分支)
git branch -D hotfixes/BJVEP933                           # 强制删除分支hotfixes/BJVEP933
git ls-files                                              # 列出git index包含的文件
git show-branch                                           # 图示当前分支历史
git show-branch --all                                     # 图示所有分支历史
git whatchanged                                           # 显示提交历史对应的文件修改
git revert dfb02e6e4f2f7b573337763e5c0013802e392818       # 撤销提交dfb02e6e4f2f7b573337763e5c0013802e392818
git ls-tree HEAD                                          # 内部命令:显示某个git对象
git rev-parse v2.0                                        # 内部命令:显示某个ref对于的SHA1 HASH
git reflog                                                # 显示所有提交,包括孤立节点
git show HEAD@{5}
git show master@{yesterday}                               # 显示master分支昨天的状态
git log --pretty=format:'%h %s' --graph                   # 图示提交日志
git show HEAD~3
git show -s --pretty=raw 2be7fcb476
git stash                                                 # 暂存当前修改,将所有至为HEAD状态
git stash list                                            # 查看所有暂存
git stash show -p stash@{0}                               # 参考第一次暂存
git stash apply stash@{0}                                 # 应用第一次暂存
git grep "delete from"                                    # 文件中搜索文本“delete from”
git grep -e '#define' --and -e SORT_DIRENT
git gc
git fsck

码字不易,觉得写得不错的动动小手点个赞。