Git操作教程
GIT使用教程
- 一. 分支
- 1. 分支概念
- 1.1 什么是分支
- 1.2 分支的作用
- 1.3 master分支
- 2. 分支的运用
- 2.1 Merge分支
- 2.2 Topic分支
- 3. 分支的切换
- 3.1 checkout
- 3.2 HEAD
- 3.3 stash
- 4. 分支的合并
- 5. 分支的常见操作
- 5.1 新建git库
- 5.2 新建分支
- 5.3 切换分支
- 5.4 添加修改并提交
- 5.5 合并分支
- 5.6 删除分支
- 5.7 并行操作
- 5.8 解决合并冲突
- 5.9 使用rebase合并
- 二. 远端数据库
- 1. pull
- 2. fetch
- 3. push
- 三. 标签
- 1. 概念
- 2. 标签操作
- 四. 改写提交
- 1. 修改最近一次的提交
- 2. 取消过去的提交(否定)
- 3. 放弃提交(回退)
- 4. 提取提交(挑单)
- 5. 汇合提交
参考 猴子都能懂得GIT入门高级篇
一. 分支
1. 分支概念
1.1 什么是分支
分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,所以在同一个数据库里可以同时进行多个修改。
1.2 分支的作用
方便多人同时对同一代码进行修改和提交,同时也方便日后对修改和提交的记录进行查看。
1.3 master分支
在数据库进行最初的提交后,Git会创建一个名为master分支,之后的提交在切换分支前会自动添加到master分支里。
2. 分支的运用
2.1 Merge分支
是为了可以随时发布release而创建的分支,还能作为Topic分支的源分支使用。保持该分支的稳定性很重要,如果要进行更改,通常需要先创建Topic分支,而针对该分支,可以使用Jenkins之类的CI工具进行自动化编译和测试。通常,会将master分支当作Merge分支使用。
2.2 Topic分支
为了开发新功能或修复Bug等任务而建立的分支,若要同时进行多个修改任务,应该创建多个Topic分支。该分支应该从稳定的Merge分支上创建,修改后,应该将其合并到Merge分支上。
3. 分支的切换
3.1 checkout
git checkout 目标分支名
3.2 HEAD
HEAD指向的是现在使用中的分支的最后一次更新。通常默认指向master分支的最后一次更新。
通过使用**~和^符号**可以指定某个提交的相对位置。通过移动HEAD,可以变更使用的分支。
3.3 stash
还未提交的修改内容以及新添加的文件,留在索引区域或工作树的情况下切换到其他的分支时,修改内容会从原来的分支移动到目标分支。
但如果目标分支上该文件也有修改,checkout会失败。这时要么需要先提交修改内容,要么需要使用stash暂时保存修改内容然后再切换分支。
stash是临时保存文件修改内容的区域。stash可以暂时保存工作树和索引里还没提交的修改内容,您可以事后再取出暂存的修改,应用到原先的分支或其他的分支上。
4. 分支的合并
点击查看merge和rebase合并的异同点
5. 分支的常见操作
5.1 新建git库
git init
5.2 新建分支
查看本地分支:git branch
查看远程分支:git branch -a
新建分支:git branch branchname
5.3 切换分支
切换到已存分支:git checkout branchname
创建新的分支并切换:git checkout -b branchname
5.4 添加修改并提交
添加修改:git add filename
提交修改:git commit -m "commit description"
一般commit description具有如下格式:
TicketNo:xxxxxx
Description: xxxxxxx
Team:OTHERS
Feature or Bugfix:Bugfix
Binary Source:No
5.5 合并分支
将指定分支导入到HEAD指向的分支,即当前分支:git merge branchname
例如将issue1分支的内容修改合并到master分支上,需要做如下操作:
- 切换到master分支:git checkout master
- 执行合并指令:git merge issue1
则前后分支情况的变化如下:
操作前:
操作后:
5.6 删除分支
删除本地指定分支:git branch -d branchname
删除远程指定分支:git push origin --delete branch_name或者git branch -dr remote_server/branch_name
5.7 并行操作
例如基于master分支某节点创建了issue2和issue3分支:
git branch issue2;
git branch issue3;
git checkout issue2;
依次切换到issue2和issue3分支上,并对同一文件同一位置作修改和提交后,分支情况如下:
5.8 解决合并冲突
把步骤6中issue2和issue3中的修改合并到master分支上,需要:
切换到master分支上:git checkout master
使用merge方式合并issue2分支:git merge issue2
执行的是fast-forward的合并方式
接着合并issue3分支:git merge issue3
自动合并失败,因为在同一文件同一行进行了修改,所以产生了冲突:
需要解冲突,做如下修改:
因为这次合并中修改了冲突部分,所以会重新创建合并修改的提交记录,这种合并不是fast-forward合并了,而是non fast-forward合并方式。
5.9 使用rebase合并
使用rebase方式合并issue3分支会使提交的历史记录更加简洁,现在暂时先取消刚刚的合并:
git reset --hard HEAD~
切换到issue3分支后,对master分支执行rebase:
git checkout issue3
git rebase master
会提示有冲突,和merge合并方式时一样需要解冲突,解冲突后提交不是使用commit命令,而是执行rebase命令指定 - -continue选项,若要取消rebase,指定 - -abort选项。
git add modified_file.txt
git rebase --continue后分支情况如图:
此时,就可以在master分支上使用fast-forward方式合并issue3分支了:
git checkout master
git merge issue3
rebase合并方式最后的文件修改内容和merge合并方式是一样的,但是历史记录更加简洁:
二. 远端数据库
远程库、本地库、本地暂存区、本地工作空间
图片来源: http://3ms.huawei.com/km/blogs/details/5946823
1. pull
git pull <远程主机名> <远程分支名>:<本地分支名>
从远程主机的远程分支拉取最新内容到本地分支
会从指定的远程分支拉取最新内容到本地分支,并且自动合并到当前分支,相当于git fetch 和 git merge结合体
git pull --rebase
拉取当前分支对应的远程分支上的最新代码,并合并到本地分支
与上面的指令区别是拉取本地分支对应的远程分支上的代码到本地,而不是指定远程分支
如果远程分支与本地分支具有冲突,将不能实现合并,需要解冲突后才能合并
2. fetch
执行fetch可以取得远程数据库的最新历史记录,取得的提交会导入到没有名字的分支,这个分支可以从FETCH_HEAD节点切换。
命令:git fetch remote_server_name
查看remote_server: git remote -v
3. push
git push <远程主机名> <本地分支名>:refs/for/<远程分支名>
常用:git push origin HEAD:refs/for/<远程分支名>
HEAD指向的就是当前分支上最新的一次提交。
远程分支如果没有指定,则会推送到本地分支对应的远程分支上,没有则会创建一个。
三. 标签
1. 概念
2. 标签操作
添加标签:
- 添加轻标签:
添加一个tag在当前的commit(HEAD):git tag tag_name
添加一个tag在指定的commit:git tag tag_name commit_id - 添加注解标签:
使用-a选项来添加注解标签,使用-m选项添加注解:git tag -am "description for this tag"
列出所有标签:git tag
显示标签的列表和注解:git tag -n
删除本地tag:git tag -d tag_name
删除远程tag:git push origin :refs/tags/tag_name
查看tag信息:git show tag_name
提交指定tag:git push remote_server_name tag_name
提交所有的tags:git push remote_server_name --tags
新建一个分支,指向某个tag:git checkout -b branch_name tag_name
查看带有标签的git log:git log --decorate
四. 改写提交
1. 修改最近一次的提交
指定amend选项执行提交的话,可以修改同一个分支最近的提交内容和注解:git commit --amend
主要使用场合:
- 添加最近提交时漏掉的档案
- 修改最近提交的注解
2. 取消过去的提交(否定)
创建否定指定提交的commit的命令:git revert commit_id
3. 放弃提交(回退)
使用reset命令来回退到指定的commit节点上,执行回退时可以根据影响的范围而指定不同的模式,可以指定是否复原索引或工作树的内容。
上表中索引指的就是暂存区,工作树指的就是工作区。
主要使用场合:
- 复原修改过的索引的状态(mixed)
- 彻底取消最近一次的提交(hard)
- 只取消提交(soft)
常用指令:
重置暂存区和工作区,回退到上次提交的指令:git reset --hard或者git reset --hard HEAD~1
重新还原到reset前的状态:git reset --hard ORIG_HEAD
回退到指定commit,只重置暂存区,工作区不变:git reset commit_id
回退到指定commit,重置暂存区和工作区:git reset --hard commit_id
重置当前分支的HEAD为指定commit,但是保持暂存区和工作区不变:git reset --keep commit_id
4. 提取提交(挑单)
选择一个commit,合并进当前分支:git cherry-pick commit_id
5. 汇合提交
实例:
汇合当前HEAD和过去指定的commit节点一起提交:git rebase -i HEAD~~
使用rebase -i 修改提交
CSDN-Ada助手: 如何定义和调用 Python 函数?
CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性;(2)使用更多的站内链接。
普通网友: 写的很详细,感谢博主的分享。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】
普通网友: 每当我阅读你的编程博客文章时,我总能感受到你的专业水平和耐心解答的精神。【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】
CSDN-Ada助手: 如何实现 Android 应用的数据持久化?