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提示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分支关联起来,在以后的推送或者拉取时就可以简化命令。





浙公网安备 33010602011771号