git的部分应用
来源:互联网 发布:pdf阅读器软件下载 编辑:程序博客网 时间:2024/06/05 04:30
分支和合并
一个Git仓库可以维护很多开发分支。现在我们来创建一个新的叫”experimental”的分支:
$ git branch experimental
此时你运行下面这条命令:
$ git branch
你会得到当前仓库中存在的所有分支列表:
experimental
* master
“experimental” 分支是你刚才创建的,“master”分支是Git系统默认创建的主分支。星号(“*”)标识了你当工作在哪个分支下,
切换分支
$ git checkout experimental
切换到”experimental”分支,先编辑里面的一个文件,再提交(commit)改动,最后切换回 “master”分支。
$ git commit -a
$ git checkout master
你现在可以看一下你原来在“experimental”分支下所作的修改还在不在;因为你现在切换回了“master”分支,所以原来那些修改就不存在了。
你现在可以在“master”分支下再作一些不同的修改:
$ git commit -a
这时,两个分支就有了各自不同的修改(diverged);我们可以通过下面的命令来合并“experimental”和“master”两个分支:
$ git merge -no-ff experimental
默认情况下,Git执行”快进式合并”(fast-farward merge),会直接将Master分支指向Develop分支。
使用–no–ff参数后,会执行正常合并,在Master分支上生成一个新节点。为了保证版本log的清晰,推荐采用这种做法。
如果这个两个分支间的修改没有冲突(conflict), 那么合并就完成了。如有有冲突,会有如下类似的信息显示
100% (4/4) done
Auto-merged file.txt
CONFLICT (content): Merge conflict in file.txt
Automatic merge failed; fix conflicts and then commit the result.
输入下面的命令就可以查看当前有哪些文件产生了冲突:
$ git diff
如果执行自动合并没有成功的话,git会在索引和工作树里设置一个特殊的状态,提示你如何解决合并中出现的冲突。
有冲突(conflicts)的文件会保存在索引中,除非你解决了问题了并且更新了索引,否则执行git commit都会失败:
$ git commit
file.txt: needs merge
如果执行git status会显示这些文件没有合并(unmerged),这些有冲突的文件里面会添加像下面的冲突标识符:
<<<<<<< HEAD:file.txt
Hello world
=======
Goodbye
>>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt
你所需要的做是就是编辑解决冲突,(接着把冲突标识符删掉),再执行下面的命令:
$ git add file.txt
$ git commit
注意:提交注释里已经有一些关于合并的信息了,通常是用这些默认信息,但是你可以添加一些你想要的注释。
这时你就可以删除掉你的 “experimental” 分支了(如果愿意):
$ git branch -d experimental
git branch -d只能删除那些已经被当前分支合并的分支. 如果你要强制删除某个分支的话就用git branch –D;下面假设你要强制删除一个叫”crazy-idea”的分支:
$ git branch -D crazy-idea
- 分布式协同开发
Bob 执行了这样的命令:
$ git clone /home/alice/project myrepo
这就建了一个新的叫"myrepo"的目录,这个目录里包含了一份Alice的仓库的克隆(clone). 这份克隆和原始的项目一模一样,并且拥有原始项目的历史记录。
Bob 做了一些修改并且提交(commit)它们:
$ git commit -a
(repeat as necessary)
当他准备好了,他告诉Alice从仓库/home/bob/myrepo中把他的修改给拉 (pull)下来。她执行了下面几条命令:
$ cd /home/alice/project
$ git pull /home/bob/myrepo master
这就把Bob的主(master)分支合并到了Alice的当前分支里了。如果Alice在 Bob修改文件内容的同时也做了修改的话,她可能需要手工去修复冲突. (注意:"master"参数在上面的命令中并不一定是必须的,因为这是一个默认参数)
git pull命令执行两个操作: 它从远程分支(remote branch)抓取修改的内容,然后把它合并进当前的分支。
如果你要经常操作远程分支(remote branch),你可以定义它们的缩写:
$ git remote add bob /home/bob/myrepo
这样,Alic可以用"git fetch"" 来执行"git pull"前半部分的工作,但是这条命令并不会把抓下来的修改合并到当前分支里。
$ git fetch bob
我们用git remote命令建立了Bob的运程仓库的缩写,用这个(缩写) 名字我从Bob那得到所有远程分支的历史记录。在这里远程分支的名字就叫bob/master.
$ git log -p master..bob/master
上面的命令把Bob从Alice的主分支(master)中签出后所做的修改全部显示出来。
当检查完修改后,Alice就可以把修改合并到她的主分支中。
$ git merge bob/master
这种合并(merge)也可以用pull来完成,就像下面的命令一样:
$ git pull . remotes/bob/master
注意:git pull 会把远程分支合并进当前的分支里,而不管你在命令行里指定什么。
其后,Bob可以更新它的本地仓库--把Alice做的修改拉过来(pull):
$ git pull
如果Bob从Alice的仓库克隆(clone),那么他就不需要指定Alice仓库的地址;因为Git把Alice仓库的地址存储到Bob的仓库配库文件,这个地址就是在git pull时使用:
$ git config --get remote.origin.url
/home/alice/project
(如果要查看git clone创建的所有配置参数,可以使用"git config -l", git config的帮助文件里解释了每个参数的含义.)
Git同时也保存了一份最初(pristine)的Alice主分支(master),在 "origin/master"下面。
$ git branch -r
origin/master
如果Bob打算在另外一台主机上工作,他可以通过ssh协议来执行"clone" 和"pull"操作:
$ git clone alice.org:/home/alice/project myrepo
- 集中式Git仓库
你还是每天在你的本地私人仓库里工作,但是会定期的把本地的修改push到你的公开仓库中;其它开发者就可以从这个公开仓库pull最新的代码。
在linux系统中创建中央版本仓库(repository),在一个空的文件夹下,输入命令:
$git --bare init
--bare 在这里是产生一个干净的中央版本仓库,仅包含版本历史记录不包含工作代码和工作目录,类似于svn服务器,这样的版本仓库可以被开发者主动push修改。
创建私有版本仓库,在个人文件夹下,输入命令:
$ git init
这样就为我们需要版本管理的代码创建了一个私有的分布式版本仓库,这个版本仓库跟我们平时在用版本仓库没有两样,你可以通过命令add,commit和reset进行版本管理。
在本地仓库添加远程仓库路径,输入命令:
$git remote add origin $CENTER_REPOSITORY_PATH
其中origin是版本库路径的别名,$CENTER_REPOSITORY_PATH
是中央版本仓库的路径,在以后的操作中可以用origin来代替。
$git push origin $BRANCH_NAME
这个命令将私有版本中的工作代码和版本历史记录添加到中央版本仓库中,其中包括这个私有版本仓库中所有的修改提交记录。
这个命令之后本地目录下的 .git/config会发生改变。
windows端checkout出代码,在msysGit的bash中,输入命令:
$ git clone origin
因为我们的服务器上的ssh协议只允许公钥/私钥远程登入,所以在执行这个命令之前需要将公私钥放到~/.ssh的目录下面。
在完成这个步骤之后,在windows和linux下已经各有一个独立的私有版本仓库,它们的地位是相同的,两者通过中央版本仓库进行代码同步。
此刻对各自私有版本仓库的commit,add和revert等操作只是对本私有版本仓库可见,修改历史对其他版本库不可见。
多人协同
user1做了些修改,然后提交修改到中央版本库
$git push origin $BRANCH_NAME
其中$BRANCH_NAME指代功能开发的分支。
user2要同步user1的修改
$ git fetch origin $BRANCH_NAME
这个是抓取一个远程的版本库中的信息到一个私有版本库中,但不更新代码。经过这个操作可以通过命令git log看到远程版本库中的所有操作。
$ git pull origin $BRANCH_NAME
这个命令真正将将user1的修改merge到当前的版本库。
经过这个操,user2已经有了user1的所有修改和提交记录。
- git的部分应用
- git 的部分操作
- git 的应用
- git 的应用学习
- git的应用
- git 的简单应用
- git stash 的应用
- git的webhook应用
- git部分提交修改的代码
- android studio使用git的部分注意事项
- git am 部分发生冲突的处理
- git命令总结(部分简单的)
- git am 部分发生冲突的处理
- Eclipse上git的应用
- git 的cherry-pick应用
- git与svn的部分区别以及《pro git》部分章节读书笔记
- 第一部分:iText的一般应用
- 单片机学习应用的六大重要部分
- Jacob解决Word文档的读写问题收藏
- Behavior相关资料
- Python模块探秘之EasyGui
- 关于百度云推送的问题
- 如何用HotSwapAgent和DCEVM让java开发像js开发一样高效(JRebel的替代方案)
- git的部分应用
- HDU 5691 状压dp
- duffing振子的四阶龙格库塔解
- RHEL6.5基本操作和实验环境部署
- 详解SYN Flood攻击原理与防范
- 普通字符串转MFC字符串函数
- 一步步学spark之一scala函数式编程中case class3.4
- ItemTouchHelper类及RecyclerView的item滑动删除和拖拽案例
- js-时间