Git分支

Git

Git是目前世界上最先进的分布式版本控制系统

分布式版本控制

版本库

创建一个空目录

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

GIt命令

通过git init命令把这个目录变成Git可以管理的仓库:

$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

GIt无法追踪图片,视频等二进制文件 只能知道图片从100KB改成了120KB 但是具体更改了什么。无法确定

文件提交至仓库

git add xxxx.txt                 用git add 把文件添加到仓库
git commit  -m  xxx.txt          把文件提交到仓库
-m 输入的是本次提交的说明

git status 时刻掌握仓库当前的状态

modified   改动

git diff 查看difference

要随时掌握工作区的状态,使用git ststus命令
如果git status告诉你有文件被修改过  用git diff可以查看修改内容

git log 显示从最近到最远的提交日志。 (可以显示最近提交的版本信息)

git log --pretty=oneline 显示版本号 版本名称

git reset --hard xxx (版本名称) 回退到xxx版本

如果回退到之前的版本后 发现现在不需要回退了

如果之前使用git log的命令行窗口没有被关闭,找到需要的版本

git reset --hard xxx(版本号)1094a

git refolg 记录每一次命令 可以查看之前输入的版本号 可以返回到需要的版本

总结

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

工作区和暂存区

我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
一旦提交后,但又没有对工作区做任何修改,那么工作区就是干净的

如果修改的内容没有放入暂存区,git commit只会把暂存区的修改提交了 (每次修改,如果不用git add 到暂存区,那么就不会加入到commit中)

git diff HEAD --readme.txt (readme是文件名) 可以查看工作区和版本库里面最新版本的区别

撤销

git checkout --file 可以丢弃工作区的修改 (没有–就变成 切换到另一个分支的命令)

git checkout --readme.txt    把readme.txt文件再工作区的修改全部撤销
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commit或git add时的状态。

git reset HEAD 可以把暂存区的修改撤销掉,重新放回工作区

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,版本回退,不过前提是没有推送到远程库。

删除

如果删除了文件,工作区和版本库就不一致了,git status会立刻告诉你那些文件被删除了

1.确定删除文件 git rm xxx 删除 并git commit 把文件提交到仓库中

2.误删文件 但是版本库中还有,使用git checkout --xxx.txt 丢弃工作区的修改

远程仓库

注册一个GitHub账号 获得Git远程仓库

在本地创建一个GIt仓库

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C "[email protected]"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
点“Add Key”,你就应该看到已经添加的Key:


分支管理

1.创建与合并分支

创建dev分支 git checkout加上 -b参数表示创建并切换

git checkout -b dev
= git branch dev
  git checkout dev

查看当前分支 git branch 列出所有分支,在当前分支前面会标有一个*号

git branch

切换回master分支

git checkout master

git merge 用于合并指定分支到当前分支

git merge dev  把dev分支的工作成果合并到master分支上

合并完分支后可以删除dev 分支了

git branch -d dev     查看当前分支 删除dev分支

git checkout    切换分支
git checkout --   撤销修改
git switch -c dev       创建并切换到新的dev分支
git switch  master      切换到已有的master分支

总结

查看分支:git branch
创建分支:git branch 
切换分支:git checkout 或者git switch 
创建+切换分支:git checkout -b 或者git switch -c 
合并某分支到当前分支:git merge 
删除分支:git branch -d 

2.解决分支冲突

如果提示有冲突 必须手动解决冲突后再提交

git status 可以查看冲突的文件

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

用git log --graph命令可以看到分支合并图

3.分支管理策略

合并分支时,加上–no-ff参数就可以用普通模式(强制禁用Fast forward模式)合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并

合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

合并分支

git merge --no-ff -m "merge with no-ff" dev
--no-ff               表示禁用Fast forward
因为本次合并要创建一个新的commit  所以加上-m 参数  把commit描述写进去
用git log 查看分支历史

分支策略

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

合并分支时,建议禁用Fast forward模式

4.Bug分支

Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

创建bug分支 首先确定要在那个分支上修复bug ,使用git status查看工作区,如果有被GIt管理的文件,就要用stash功能,把工作存储起来。没有被Git管理的文件,就可以创建临时分支来修改Bug

Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
1.git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
2.git stash pop,恢复的同时把stash内容也删了
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;

在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick 命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
git mstash   
git checkout master      切换到主分支  (因为要在主分支上创建临时分支)要在那个分支上修复bug 就需要在那个分支上创建临时分支。因为假定在master上创建临时分支,所以需要切换到master分支上去。
git checkout -b    创建+切换分支
git switch master        修复完成后,需要切换到master分支,并完成合并,最后删除创建的临时分支
git merge --no-ff -m "merged bug fix 101" issue-101(分支名称) 把issue-101临时分支合并到master分支上
禁用Fast forward 创建一个新的commit 加上-m参数 把commit描述写进去
git switch dev   切换到dev分支 (修改bug完成后,回到dev分支可以继续工作)也可以回到master分支
git stash list   查看stash列表    (可以多次stash,恢复的时候用git stash list查看,
git stash apply stash@{0}          恢复到指定的stash
git stash pop  恢复stash的同时把stash内容也删除了
git stash list      确认一下,发现看不到任何stash内容了

如果同一个bug出现在多个分支上

git branch   查看当前分支 先进入到需要修改bug的分支上
git cherry-pick  xxxxx(bug修改完成的分支)
复制一个特定的提交到当前分支上    (把bug提交的修改复制到当前分支,避免重复劳动)

5.Feature

开发一个新feature,最好新建一个分支;

如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。

Git友情提醒,feature-vulcan分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D参数。。

6.多人协作

当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin

要查看远程库的信息,用git remote

$ git remote      查看远程库信息
$ git remote -v   查看更详细的远程库信息
origin  [email protected]:michaelliao/learngit.git (fetch)
origin  [email protected]:michaelliao/learngit.git (push)
显示了可以抓取和推送的origin的地址,如果没有推送权限,就看不到push的地址

推送分支

推送分支就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样Git就会把该分支推送到远程库对应的远程分支上。

git push origin master       git push (远程仓库的远程分支)   (本地库的本地分支)
git push origin dev             推送dev分支

本地新建的分支如果不推送到远程,对其他人就是不可见的

抓取分支

git checkout -b dev origin/dev            创建远程origin的dev分支到本地(创建本地dev分支)

推送失败 两个人同时提交的有冲突,先用git pull 把最新提交从origin/dev抓下来,然后,在本地合并,解决冲突,再推送

git pull    抓取远程的新提交  (失败了是没有指定本地dev分支与远程origin/dev分支的链接)
git brach --set-upstream-to=origin/dev dev       设置dev和origin/dev的链接

多人协作的工作模式:

用git push origin 推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to  origin/
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突

你可能感兴趣的:(git,git,github,gerrit,运维,服务器)