zhou@zhou-PC:~/Desktop$ cd abcd/test/
zhou@zhou-PC:~/Desktop/abcd/test$ ls
README.md
zhou@zhou-PC:~/Desktop/abcd/test$ git che
checkout cherry cherry-pick
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout -b dev
切换到一个新分支 'dev'
-b
表示创建并切换分支
zhou@zhou-PC:~/Desktop/abcd/test$ git branch
* dev
master
zhou@zhou-PC:~/Desktop/abcd/test$ echo "这是在分支上提交的内容" >> README.md
zhou@zhou-PC:~/Desktop/abcd/test$ cat README.md
# test
测试
新增一行
这是在分支上提交的内容
zhou@zhou-PC:~/Desktop/abcd/test$ git add README.md
zhou@zhou-PC:~/Desktop/abcd/test$ git commit -m "提交分支" README.md
[dev 59dedac] 提交分支
1 file changed, 1 insertion(+)
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout master
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
zhou@zhou-PC:~/Desktop/abcd/test$ cat README.md
# test
测试
新增一行
发现刚才添加的文件不见了
zhou@zhou-PC:~/Desktop/abcd/test$ git merge dev
更新 61a52f0..59dedac
Fast-forward
README.md | 1 +
1 file changed, 1 insertion(+)
zhou@zhou-PC:~/Desktop/abcd/test$ cat README.md
# test
测试
新增一行
这是在分支上提交的内容
再次查看发现已经有了刚才新添加的文字
zhou@zhou-PC:~/Desktop/abcd/test$ git branch -d dev
已删除分支 dev(曾为 59dedac)。
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout -b frature1
切换到一个新分支 'frature1'
zhou@zhou-PC:~/Desktop/abcd/test$ echo "解决冲突" >> README.md zhou@zhou-PC:~/Desktop/abcd/test$ git add README.md
zhou@zhou-PC:~/Desktop/abcd/test$ git commit -m "解决冲突" README.md
[frature1 5b783b1] 解决冲突
1 file changed, 1 insertion(+)
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout master
切换到分支 'master'
您的分支领先 'origin/master' 共 1 个提交。
(使用 "git push" 来发布您的本地提交)
zhou@zhou-PC:~/Desktop/abcd/test$ cat README.md
# test
测试
新增一行
这是在分支上提交的内容
zhou@zhou-PC:~/Desktop/abcd/test$ echo "master解决冲突" >> README.md
zhou@zhou-PC:~/Desktop/abcd/test$ git add README.md
zhou@zhou-PC:~/Desktop/abcd/test$ git commit -m "master解决冲突" README.md
[master bf493b6] master解决冲突
1 file changed, 1 insertion(+)
zhou@zhou-PC:~/Desktop/abcd/test$ git merge frature1
自动合并 README.md
冲突(内容):合并冲突于 README.md
自动合并失败,修正冲突然后提交修正的结果。
zhou@zhou-PC:~/Desktop/abcd/test$ git status
位于分支 master
您的分支领先 'origin/master' 共 2 个提交。
(使用 "git push" 来发布您的本地提交)
您有尚未合并的路径。
(解决冲突并运行 "git commit")
(使用 "git merge --abort" 终止合并)
未合并的路径:
(使用 "git add <文件>..." 标记解决方案)
双方修改: README.md
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
zhou@zhou-PC:~/Desktop/abcd/test$ cat README.md
# test
测试
新增一行
这是在分支上提交的内容
<<<<<<< HEAD
master解决冲突
=======
解决冲突
>>>>>>> frature1
<<<<<<<
、>>>>>
、========
此处这种标记表示为不同分支的内容
zhou@zhou-PC:~/Desktop/abcd/test$ vim README.md
zhou@zhou-PC:~/Desktop/abcd/test$ cat README.md
# test
测试
新增一行
这是在分支上提交的内容
解决冲突
zhou@zhou-PC:~/Desktop/abcd/test$ git add README.md
zhou@zhou-PC:~/Desktop/abcd/test$ git commit -m "提交解决冲突" [master 212a9ec] 提交解决冲突
zhou@zhou-PC:~/Desktop/abcd/test$ git log --graph --pretty=oneline --abbrev-commit
* 212a9ec 提交解决冲突
|\
| * 5b783b1 解决冲突
* | bf493b6 master解决冲突
|/
* 59dedac 提交分支
* 61a52f0 新增一行
* 031235d vdsf
* 0bb0006 Initial commit
zhou@zhou-PC:~/Desktop/abcd/test$ git branch -d frature1
已删除分支 frature1(曾为 5b783b1)。
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout -b dev
切换到一个新分支 'dev'
zhou@zhou-PC:~/Desktop/abcd/test$ echo "dev分支管理策略" >> README.md
zhou@zhou-PC:~/Desktop/abcd/test$ git add README.md
zhou@zhou-PC:~/Desktop/abcd/test$ git commit -m "dev分支管理策 略"
[dev 5581b0e] dev分支管理策略
1 file changed, 1 insertion(+)
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout master
切换到分支 'master'
您的分支领先 'origin/master' 共 4 个提交。
(使用 "git push" 来发布您的本地提交)
zhou@zhou-PC:~/Desktop/abcd/test$ git merge --no-ff -m "master 分支管理策略" dev
Merge made by the 'recursive' strategy.
README.md | 1 +
1 file changed, 1 insertion(+)
--no-ff
表示禁用fast forward
zhou@zhou-PC:~/Desktop/abcd/test$ git log --graph --pretty=oneline --abbrev-commit
* b51dc30 master分支管理策略
|\
| * 5581b0e dev分支管理策略
|/
* 212a9ec 提交解决冲突
|\
| * 5b783b1 解决冲突
* | bf493b6 master解决冲突
|/
* 59dedac 提交分支
* 61a52f0 新增一行
* 031235d vdsf
* 0bb0006 Initial commit
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。
某些情况下,工作只进行到一半,还没法提交,但是又急需修改一个bug
这种情况下可以使用stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作
zhou@zhou-PC:~/Desktop/abcd/test$ echo "def name(uname,upasswd):" >> hello.py
zhou@zhou-PC:~/Desktop/abcd/test$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: hello.py
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
zhou@zhou-PC:~/Desktop/abcd/test$ git stash
保存工作目录和索引状态 WIP on master: 3b14734 新建文件
HEAD 现在位于 3b14734 新建文件
再次用status查看就是干净的工作区
zhou@zhou-PC:~/Desktop/abcd/test$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
无文件要提交,干净的工作区
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout -b bug-101
切换到一个新分支 'bug-101'
zhou@zhou-PC:~/Desktop/abcd/test$ echo "" > hello.py
zhou@zhou-PC:~/Desktop/abcd/test$ git add hello.py
zhou@zhou-PC:~/Desktop/abcd/test$ git commit -m "删除了bug" hello.py
[bug-101 f714525] 删除了bug
1 file changed, 1 insertion(+), 1 deletion(-)
zhou@zhou-PC:~/Desktop/abcd/test$ git checkout master
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
zhou@zhou-PC:~/Desktop/abcd/test$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
无文件要提交,干净的工作区
zhou@zhou-PC:~/Desktop/abcd/test$ git merge --no-ff -m "merged bug fix 101" bug-101
Merge made by the 'recursive' strategy.
hello.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
zhou@zhou-PC:~/Desktop/abcd/test$ git stash list
stash@{0}: WIP on master: 3b14734 新建文件
git stash pop
zhou@zhou-PC:~/Desktop/abcd/test$ git stash pop
位于分支 master
您的分支与上游分支 'origin/master' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: hello.py
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
丢弃了 refs/stash@{0} (2ace0d6c93da6e1b6b79bcc8b9eaaa08efc2d256)
zhou@zhou-PC:~/Desktop/abcd/test$ git stash list
这里再次查看就看不到任何stash内容了
zhou@zhou-PC:~/Desktop/abcd/test$ git branch -d bug-101
已删除分支 bug-101(曾为 f714525)。
$ git checkout -b feature-vulcan
Switched to a new branch 'feature-vulcan'
$ git add vulcan.py
$ git status
On branch feature-vulcan
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: vulcan.py
$ git commit -m "add feature vulcan"
[feature-vulcan 287773e] add feature vulcan
1 file changed, 2 insertions(+)
create mode 100644 vulcan.py
git checkout master
删除会失败
$ git branch -d feature-vulcan
error: The branch 'feature-vulcan' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature-vulcan'.
使用
-D
强行删除
$ git branch -D feature-vulcan
Deleted branch feature-vulcan (was 287773e).
zhou@zhou-PC:~/Desktop/abcd/test$ git remote
origin
zhou@zhou-PC:~/Desktop/abcd/test$ git remote -v
origin [email protected]:chineselijie/test.git (fetch)
origin [email protected]:chineselijie/test.git (push)
-v
更详细的显示
zhou@zhou-PC:~/Desktop/abcd/test$ git push origin master
若推送其他分支
zhou@zhou-PC:~/Desktop/abcd/test$ git push origin dev
zhou@zhou-PC:~/Desktop/abcd/test$ git clone [email protected]:chineselijie/test.git
多人协作的工作模式通常是这样:
首先,可以试图用git push origin 推送自己的修改;
如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
如果合并有冲突,则解决冲突,并在本地提交;
没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to origin/。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
查看远程库信息,使用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 pull,如果有冲突,要先处理冲突。
rebase操作可以把本地未push的分叉提交历史整理成直线
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
u@zhou-PC:~/Desktop/abcd/test$ git log --graph --pretty=oneline --abbrev-commit
* ded0d45 清空了文字
* 5edf5c9 merged bug fix 101
|\
| * f714525 删除了bug
|/
* 3b14734 新建文件
* b51dc30 master分支管理策略
|\
| * 5581b0e dev分支管理策略
|/
* 212a9ec 提交解决冲突
|\
| * 5b783b1 解决冲突
* | bf493b6 master解决冲突
|/
* 59dedac 提交分支
* 61a52f0 新增一行
* 031235d vdsf
* 0bb0006 Initial commit