美文网首页11.后端iOS 好东西前端知识库
Git 在项目中的实际使用指南

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

作者: stone呀 | 来源:发表于2018-04-10 18:27 被阅读711次
    • 每日一图

    版权声明:本文为 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
    

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

    相关文章

      网友评论

      • 被opengl折磨的微笑:写的不错,学习了
        stone呀:@被opengl折磨的微笑 相互学习
      • jie_4e47:图形操作也挺好,一直图形,没有出现不理解,飘过……
        stone呀:@jie_4e47 :smile::smile:
      • caae:写的很好,建议合并分支的时候加个 —no-f选项,这样也算是一次提交记录。
        stone呀:@caae 好的:smile:谢谢您的建议
      • 刺客的幻影:写得很详细,参照实践
        stone呀:有什么写得不详细或者不太准确的地方可以一起交流:smile:

      本文标题:Git 在项目中的实际使用指南

      本文链接:https://www.haomeiwen.com/subject/frinhftx.html