Git入门——(二)常用命令及分支管理

(二)常用命令及应用

当下使用最多最广泛的版本管理工具也就Git与SVN,本篇博客介绍Git使用入门,以及重点介绍一些实际开发中遇到的问题的解决方法。如:分支操作、代码合并与冲突解决、标签与版本回退、账号密码问题。

创建版本库

  • 克隆远程版本库:git clone
    • 适用于本地文件夹下无代码;
    • clone方式创建的本地版本库分支与远程默认绑定关系。
  • 初始化本地版本库:git init
    • 适用于已有本地项目
    • 克隆就无需初始化本地版本库;
    • init方式默认无绑定关系。

远程仓库管理

  • 删除关联:git remote rm origin
  • 添加关联:git remote add origin
  • 修改关联地址:git remote origin set-url
  • 查看远程仓库信息:git remote show origin ;或者 git remote
$ git remote -v
origin  https://gitee.com/shuzheng/zheng.git (fetch)
origin  https://gitee.com/shuzheng/zheng.git (push)
注:如果没有推送权限,就看不到push。
  • 拉取远程分支: git pull 当前分支自动与唯一一个追踪的远程分支进行合并。
1. git pull 相当于下面两条命令
$ git fetch origin 
$ git merge origin/next

2. git pull origin next:master  取回origin主机的next分支,与本地的master分支合并。这种方式操作指向性更明确。
3. 以rebase方式合并。  git pull --rebase <远程主机名> <远程分支名>:<本地分支名> 。关于合并,后面详细讲解。

  • 追踪关系(tracking)。在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系。比如clone。Git也允许手动建立追踪关系。$ git branch --set-upstream-to=<remote branch> <local branch>

  • 推送(push):git push 默认推送当前分支到远程当前分支。也可以推送当前分支到指定远程分支,如:git push -u origin <local branch>:<remote/branch> 。注:带上-u参数,下次git push就会默认推送到上述分支。

修改与提交

  • 查看当前分支状态:git status 常用命令

  • 查看变更内容:git diff

  • 添加所有修改文件到本地暂存区:git add . 已被添加过的文件或文件夹再次修改时commit到本地版本库再推送即可;此处可使用正则,如 git add *.java

  • 添加指定文件到本地暂存区:git add 多个文件可用空格隔开

  • 提交文件到本地版本库当前分支:git commit –m “备注” 后面可跟需要提交的文件,默认是全部变化;

  • Git是跟踪修改,并非跟踪文件;每次修改,如果不用git add到暂存区,那就不会加入到commit中。这点与svn不同,svn对于已经add到版本管理的文件,后续修改,不用再次add,git是每次修改都需要add

分支操作

  • 显示本地所有分支:git branch;显示本地与远程所有分支:git branch –a;
  • 创建分支: git branch
  • 切换分支: git checkout
  • 创建并切换到新分支:git checkout –b ,默认基于当前分支创建,
  • 基于指定分支创建新分支:git checkout -b   
  • 删除本地分支:git branch –d   git branch –D   -D:删除未被合并的分支;
  • 删除远程分支:git push origin :  冒号千万别丢
  • 删除tag:git tag –d
  • 合并分支到当前分支:git merge --no-ff -m “loginfo” 默认情况下,没有--no-ff参数,加上--no-ff参数,表示禁用Fast forward;Fast forward模式合并,是指快进模式合并,即将当前分支直接指向目标分支;此时合并后,如果删除目标分支,则会丢失目标分支提交的信息;
  • 查看原分支与合并分支之间的差别:git diff <source_branch> <target_branch>

bug分支

  • git stash list
  • git stash apply git stash drop
  • git stash pop
    修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

标签操作

  • 显示本地所有tag:git tag
  • 给当前分支最新提交版本打tag:git tag –a -m “xxxxxxxxxxxxx”,注:-a指定标签名,-m指定说明文字
  • 给指定的某次操作打tag:git tag 34372b05 注:34372b05为提交号,可以通过git log --pretty=oneline --abbrev-commit 查看
  • 推送本地tag到远程:git push origin
  • 一次推送所有未推送至远程的标签:git push origin --tags
  • 查看指定tag信息:git show
  • 删除指定本地tag:git tag -d
  • 删除指定远程tag:a、执行步骤7,先删除本地标签 b、从远程删除:git push origin :refs/tags/

日志与回退

  • 查看本地提交历史:git reflog
  • 查看本地+远程提交历史:git log --graph --pretty=oneline --abbrev-commit,注:为了显示简洁,最好加上--pretty=oneline --abbrev-commit;
  • 工作区修改撤销:
    • a、撤销以修改的所有文件,不包括新增的文件:git checkout .;
    • b、撤销指定文件的修改:git checkout
  • Add后但未commit撤销:
    • a、撤销所有add文件 :git reset HEAD .;
    • b、撤销指定add文件:git reset HEAD
  • Add/commit后撤销:
    • a、只回退commit的信息,保留修改代码:git reset --soft HEAD,
    • b、彻底回退到上次commit版本,不保留修改代码:git reset --hard head^,注:HEAD :当前版本;HEAD^ :上一个版本;head~100:回退到前100个版本;--hard 参数会抛弃当前工作区的修改,--soft 参数会回退到之前的版本,但是保留当前工作区的修改,可以重新提交;
  • 本地代码回退到与git远程仓库保持一致:git reset --hard 远程分支名;
  • Push后撤销:
    • a、git log查看commit的信息,
    • b、git revert commit_id,
    • c、git push 此时本地回滚的代码到服务器就可以了;
  • git merge后撤销:
    • a、git checkout 【merge操作时所在的分支】,
    • b、git reset --hard 【merge前的版本号】;
  • 查看记录的每一次命令:git reflog
  • 回退到上一版本:git reset --hard head^ --soft
  • 回退到指定版本:git reset --hard commit_id --soft
  • 注意:回滚主分支前需要移除保护权限;默认master是受保护的主分支;

撤销

  • 撤销还未添加到暂存区的修改:git checkout -- ;其实是用版本库里的版本替换工作区的版本
  • 撤销还未提交到分支,却已添加到暂存区的修改:git reset HEAD ;这时想撤销工作区的修改,可使用 git checkout --
    小结: 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

删除

  • git rm git中删除也是一种添加;

备注:本地只有一人操作,是否就没有必要有多个本地分支(git branch -D );只需要将本地这一分支提交到远程不同分支即可;

忽略

  • 创建文件.gitignore:touch .gitignore
  • 定义全局的.gitignore :git config --global core.excludesfile ~/.gitignore

冲突解决、push失败、pull失败怎么办

  • 冲突时如何推送代码
    冲突

因此,多人协作的工作模式通常是这样:
首先,可以试图用git push origin 推送自己的修改;如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;如果合并有冲突,则解决冲突,并在本地提交;没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令$ git branch --set-upstream-to=<remote branch> <local branch>。这就是多人协作的工作模式,一旦熟悉了,就非常简单。

//冲突产生后的代码,示例如下:
<head>
您的分支版本代码
=======
目标分支版本代码
>>>>>>>>

head 是当前版本。
下面是远程版本。

  • 1.在当前分支基础上新建分支feature1: git checkout -b feature1

  • 2.编辑修改,并在feature1上添加并提交;

  • 3.切换到master分支上,编辑修改;并添加提交;此时master与feature1分支图如下:
    分支产生

  • 4.这种情况下,Git无法执行快速合并,只能试图把各自的修改合并起来,但是这种合并就可能会产生冲突,我们试试看;执行 git merge feature1

  • 5.冲突产生
    冲突

  • 6.果然冲突了!Git告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件;

  • 7.然后直接查看或编辑冲突的文件的内容

  • 重新添加并提交;执行 git add readme.txt git commit -m "conflict fixed"

  • 此时master分支如下图:
    合并分支后

  • 查看分支的合并情况:git log --graph --pretty=oneline --abbrev-commit

  • 最后,删除分支:git branch -d feature1

git pull --rebase origin dev

总结:当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。用git log --graph命令可以看到分支合并图。

小结

查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用$ git branch --set-upstream-to=<remote branch> <local branch>。
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

分支管理最佳实践

Git分支流程最佳实践

附录及参考

菜鸟教程-Git
Git官方文档中文版

posted @ 2019-12-27 15:27  LuciusNi  阅读(163)  评论(0)    收藏  举报