Git使用(下)

Git使用(下)

1、比较提交-Git Diff

1.1、比较提交-Git Diff

你可以用git diff来比较项目中任意两个版本的差异

git diff master..test

上面这条命令只显示两个分支间的差异,如果你想找出“master”,“test”的共有父分支和“test”分支之间的差异,你用3个’.’来取代前面的两个’.’

git diff master...test

git diff是一个难以置信的有用的工具,可以找出你项目上任意两点间的改动,或是用来查看别人提交进来的新分支。

1.2、哪些内容会被提交

通常你用git diff来找你当前工作目录和上次提交与本地索引间的差异。

git diff

上面的命令会显示在当前的工作目录里的,没有staged(添加到索引中),且在下次提交时不会被提交的修改。如果你要看在下次提交时要提交的内容(staged,添加到索引中),你可以运行

git diff HEAD

上面这条命令会显示你工作目录与上次提交时之间的所有差别,这条命令所显示的内容都会在执行git commit -a命令时被提交。

1.3、更多的比较选项

如果你要查看当前的工作目录与另一个分支的差别,你可以用下面的命令执行

git diff test

这会显示你当前工作目录与另一个叫“test”分支的差别。你也可以加上路径限定符,来只比较某一个文件或目录

git diff HEAD -- ./lib

上面这条命令会显示你当前工作 目录下的lib目录与上次提交之间的差别(或者更准确的说是在当前分支)。如果不是查看每个文件的详细差别,而是统计一下有哪些文件被改动,有多少行被改动,就可以使用–stat参数

git diff --stat

有时这样全局性的查看哪些文件被修改,能让你更轻一点。

2、分布式的工作流程

2.1、分布式的工作流程

现在我们的项目在/home/shiyanlou/gitproject建了一个新的git仓库;另一个用户的工作目录也在同一台机器,也要提交代码。执行了这样的命令克隆新的工作目录

git clone /home/shiyanlou/gitproject myrepo

这样建了一个新的叫myrepo的目录,这个目录里包含了一份gitproject仓库的克隆。这份克隆和原始的项目一模一样,并且拥有原始项目的历史记录。在myrepo做了一些修改并且提交它们

cd repo
echo "newcontent" > newfile
git add newfile
git commit -m "add"

myrepo修改完成后,需要在仓库/home/shiyanlou/gitproject中把myrepo的修改给拉下来。执行下面几条命令

cd /home/shiyanlou/gitproject
git pull /home/shiyanlou/myrepo master

这就把myrepo的主分支合并到了gitproject的当前分支里了。如果gitproject在myrepo修改文件内容的同时也做了修改的话,他可能需要手工去修复冲突(注意:“master”参数在上面的命令中并不一定是必须的,因为这是一个默认参数)git pull命令执行两个操作:它从远程分支抓取修改了的内容,然后把它合并进当前的分支。如果你要经常操作远程分支,你可以定义它们的缩写:

git remote add myrepo /home/shiyanlou/myrepo

这样,gitproject里可以用“git fetch”来执行“git pull”前半部分的工作,但是这条命令并不会把抓下来的修改合并到当前分支里。

git fetch myrepo

我们用git remote,命令建立了myrepo的远程仓库的缩写,用这个(缩写)名字我从myrepo那得到所有远程分支的历史记录。在这里远程分支的名字就叫myrepo/master

git log -p master..myrepo/master

上面的命令把myrepo从gitproject的主分支中签出后所做的修改全部显示出来。当检查完修改后,gitproject就可以把修改合并到它的主分支中。

git merge myrepo/master

这种合并也可以用pull来完成,就像下面的命令一样

git pull . remotes/myrepo/master

注意:git pull会把远程分支合并进当前的分支里,而不管你在命令行里指定什么。其后,myrepo可以更新它的本地仓库–把gitproject做的修改拉过来

git pull

如果myrepo从gitproject的仓库克隆,那么它就不需要指定gitproject仓库的地址;因为Git把gitproject仓库的地址存储到myrepo的仓库配库文件,这个地址就是在git pull时使用

git config --get remote.origin.url

Git同时也保存了一份最初的gitproject主分支,在origin/master下面

git branch -r

如果myrepo打算在另外一台主机上工作,它可以通过ssh协议来执行clone和pull操作

git clone alice.org:/home/shiyanlou/gitproject myrepo

2、公共Git仓库

另外一个提交修改的办法,就是告诉项目的维护者用git pull命令从你的仓库里把修改拉下来。这和从主仓库里更新代码类似,但是是从另外一个方向来更新的。如果你和维护者都在同一台机器上有帐号,那么你们可以互相从对方的仓库目录里直接拉所作的修改;git命令里的仓库地址也可以是本地的某个目录名

git clone /path/to/repository
git pull /path/to/other/repository

也可以是一个ssh地址

git clone ssh://yourhost/~you/repository

3、将修改推到一个公共仓库

通过http或是git协议,其它维护者可以抓取你最近的修改,但是它们没有写权限。这样,这需要将本地私有仓库的最近修改上传公共仓库中。最简单的办法就是用git push命令和ssh协议;用你本地的master分支去更新远程的master分支,执行下面的命令:

git push ssh://yourserver.com/~you/proj.git master:master

或者

git push ssh://yourserver.com/~you/proj.git master

和git-fetch命令一样git-push如果命令的执行结果不是“快速向前”就会报错;下面的章节会讲如何处理这种情况。push命令的目的仓库一般是个裸仓库。你也可以推到一个签出工作目录树的仓库,但是工作目录中内容不会被push命令所更新。如果你把自己的分支推到一个已签出的分支里,这会导致不可预知的后果。在用git-fetch命令时,你也可以修改配置参数,让你少打字。下面这些是例子

cat >> .git/config <<EOF

你可以用下面的命令来代替前面复杂的命令:

 git push public-repo master

4、当推送代码失败时要怎么办

如果推送(push)结果不是”快速向前”(fast forward),那么它可能会报像下面一样的错误

error: remote 'refs/heads/master' is not an ancestor of
local  'refs/heads/master'.
Maybe you are not up-to-date and need to pull first?
error: failed to push to 'ssh://yourserver.com/~you/proj.git'

这种情况通常由以下的原因产生: 用 git-reset –hard 删除了一个已经发布了的一个提交,或是 用 git-commit –amend 去替换一个已经发布的提交,或是 用 git-rebase 去rebase一个已经发布的提交.  你可以强制git-push在上传修改时先更新,只要在分支名前面加一个加号。

git push ssh://yourserver.com/~you/proj.git +master
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值