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


  • 分布式协同开发
    假设Alice现在开始了一个新项目,在/home/alice/project建了一个新的git 仓库(repository);另一个叫Bob的工作目录也在同一台机器,他要提交代码。 
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仓库

    一旦涉及多人在不同的工作目录下协同开发时,需要建立一个中央版本仓库,因为分布式的版本仓库一旦checkout之后,就不能被其他开发者主动执行push操作。下图就是一个多系统下多人合作协同开发的工作目录示意图,user1和user2需要一起合作开发一个功能,为了避免在开发完成之前就提交svn主版本库,可以运用git来进行小规模的代码同步,同时user1和user2又需要在linux和windows下面进行开发,也需要时时同步代码。为了完成这个需求,可以在windows和linux下各建立一个git工作目录,然后在任一台机子建立一个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的所有修改和提交记录。 

0 0
原创粉丝点击