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

  • 每日一图 《Git 在项目中的实际使用指南》

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

点击查看 Git 官方文档介绍

1.前话

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

2.笔者的一点点建议

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

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

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

3.Git 具体命令

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

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

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

一、初始化和提交

$ git init

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

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

$ git status 【常用】

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

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

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

$ git add xxx

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

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

可以看到,文件颜色改变(我这里将 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 在项目中的实际使用指南》

$ git commit -am “xxx” 【常用】

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

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

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

二、日志的显示

$ git log 【比较常用】

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

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

三、创建和切换分支

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

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

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

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

$ git checkout xxx【常用】

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

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

已经切换到 test 分支。

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

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

四、查看分支

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

查看本地分支

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

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

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

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

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

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

$ git push origin xxx 【常用】

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

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

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

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

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

$ git fetch origin xxx【比较常用】

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

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

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

$ git merge FETCH_HEAD【比较常用】

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

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

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

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

$ git pull origin xxx【常用】

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

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

六、合并分支

$ git merge

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

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

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

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

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

$ git merge –no-ff -m “merge width no-ff” dev

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

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

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

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

七、删除分支

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

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

  • 需要一提的是,比如你当前处于 test 分支, 然后你在 test 分支执行删除 test 分支操作,是会报错的:

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

  • 我们需要先切换到非需删除分支,比如先切换到 master 主分支,然后再执行删除操作

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

$ git push origin –delete xxx【比较常用】

删除远程分支

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

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

八、版本回滚

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

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

  • git log 查看 commit id (ctrl + z 退出)

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

  • 从上图中可以看到有两次提交,我们回滚到第一次提交的状态

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

  • 此时 git log,只剩一条记录

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

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

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

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

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

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

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

有时候可能有这种情况,你接触的项目已经有很多个分支了,你在第一次 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

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

    原文作者:stone呀
    原文地址: https://www.jianshu.com/p/53a00fafbe99
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞