冲突合并
创建分支feature1分支,在feature1中修改readme文件,然后在分支中添加并提交,
$git checkout -b feature1
Switchedto a new branch'feature1'//在readme文件中添加一句话Creating a new branch is quick And simple.
$ git add readme.txt
$ gitcommit-m"AND simple"
[feature175a857c]ANDsimple
1file changed,1insertion(+),1deletion(-)
此时切换到master分支,此时git会提示我们当前的master比远端的master分支超前一个提交(因为我们创建了feature1分支并提交了所以会提示超前一个提交),
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1commit.
此时在master分支同样修改readme文件,修改后保存并add、commit,在readme中添加Creating anewbranch is quick & simple.
$git add .
$git commit -m "&"
此时状态是这样
现在,master分支和feature1分支各自都分别有新的提交,变成了这样:
这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突
$git merge feature1
他会提示冲突,使用git status查看冲突原因,查看之后发现是both modif readme文件,解决冲突就是打开readme文件。在文件中Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们选其中一个版本留下删除冲突中的任意一句,然后把git的标记也删除之后保存文件,然后再
$git add readme.txt
$git commit -m "conflict fixed"
现在,master分支和feature1分支变成了下图所示:
用带参数的git log也可以看到分支的合并情况:
$ git log --graph --pretty=oneline --abbrev-commit
*59bc1cb conflict fixed
|\
| *75a857cANDsimple
* |400b400 & simple
|/* fec145a branch test
...
最后,删除feature1分支:
$git branch -d feature1
Deletedbranch feature1 (was75a857c).
Bug分支
当前情况:此时有两个分支,master和dev,dev编辑到一半,并未成功写完,所以不能提交。但此时master有一个bug需要马上去修复,但因为dev无法提交,所以用stash保存现场。转去master去把bug修复完后。转到dev中,重点:此时要先执行git merge master 来讲master中的bug合并到dev分支中,然后再用指令dit stash pop恢复现场。因为dev分支并未commit,所以不能够merge。这样在master中修复的bug同步到dev的分支中在pop现场也比较有意义。。
$git stash //当前在dev分支,保存当前工作环境
$git checkout master //回到master
$git branch -b issue-101 //在master创建新的分支并在iusse101中修复bug
$git checkout issue-101 //切换issue-101执行bug修复内容 ,修复完成后要add 该文件并且commit
$git chekout master
$git merge issue-101 //将issue修改的bug修复并在master中执行合并操作
$git branch -d issue-101 //完成bug修复后删除issue分支$git checkout dev
$git merge master //切换到dev分支并将修复好的master与dev合并
合并后可以用 git stash list查看stash的列表
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了。你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
$git stash apply stash@{0}
feature功能分支删除
在开发新功能时我们最好创建feature分支来开发然后将其合并到dev分支,在feature执行add 和commit之后就在要合并的时候突然要取消该功能,那么想要删除这个分支的时候我们需要执行:
$git branch -D feature
此指令表示强行删除,如果删除之前没有merge那么就找不回来了。
多人协作
查看远端信息:
$git remote -v //显示远端信息 一般有fetch 和push的信息
将本地内容push到远端:
$git push origin master //将本地master分支全部提交到远端master,本地和远端的分支名要一一对应,本地dev和远端dev提交就修改后边为$git push origin dev参数。
抓取分支:
多人协作的工作模式通常是这样:
首先,可以试图用git push origin branch-name推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
小结
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用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 branch --set-upstream-to=origin/dev dev)
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
出现以下错误:fatal: Cannot update paths and switch to branch 'develop' at the same time.
解决方案
先git fetch
再git checkout -b develop origin/develop (因为本地没有develop分支信息,需要先fetch或者pull下来)
Tag标签
命令git tag 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
git tag -a <tag标签> -m "blablabla..." <commit_id>可以指定标签信息;
git tag -s <tag标签> -m "blablabla..." <commit_id>可以用PGP签名标签;
命令git tag可以查看所有标签。
命令git show <tag标签>可以查看该版本标签内容说明
如果标签打错了可以删除标签
$git tag -d v0.1
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
如果要推送某个标签到远程,使用命令git push origin <tagname>
$git push origin v1.0
或者,一次性推送全部尚未推送到远程的本地标签:
$git push origin --tags
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$git tag -d v0.1
然后,从远程删除。删除命令也是push,但是格式如下:
$git push origin :refs/tags/0.1
要确认远端是否真的删除了,就打开github从那上边看.
设置git忽略文件
进入系统的主目录
$cd
$vim .gitignore
之后就可以编辑你要配置的忽略文件了,也可以从github中找到已经配置好的忽略文件GitHub - github/gitignore: A collection of useful .gitignore templates
配置别名
$git config --global alias.<st> <status>
意思即为以后输入git st即表示git status。
当然还有别的命令可以简写,很多人都用co表示checkout,ci表示commit,br表示branch:
$git config --globalalias.co checkout
$git config --globalalias.ci commit
$git config --globalalias.br branch
以后提交就可以简写成:
$git ci -m"bala bala bala..."
--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。
在撤销修改中,我们知道,命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区。既然是一个unstage操作,就可以配置一个unstage别名:
$git config --global alias.unstage 'reset HEAD'
当你敲入命令:
$git unstage test.py
实际上Git执行的是:
$ git reset HEAD test.py
配置一个git last,让其显示最后一次提交信息:
$git config --globalalias.last'log -1'
这样,用git last就能显示最近一次的提交:
$ git last
commit adca45d317e6d8a4b23f9811c3d7b7f0f180bfe2
Merge: bd6ae48 291bea8
Author: Michael Liao
Date: Thu Aug 22 22:49:22 2013 +0800 merge & fix hello.py
甚至还有人丧心病狂地把lg配置成了:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
来看看git lg的效果:
配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中。在主目录中查看输入
$cat .config
得到的输入就中就有【alias】,如果需要修改alias直接打开删除修改就行了。配置别名也可以在config中修改。
首次拉取远端仓库到远端出现:
fatal: refusing to merge unrelated histories解决办法:
使用:git pull origin master --allow-unrelated-histories
想看到最近一次提交所有更改的细节(1表示最近1次 可换2)
git log -n 1-p
想看到最近一次提交所有更改过的文件
git log -n 1 --stat