git笔记(二)

102 阅读6分钟

远程仓库

查看远程仓库

git remote 会列出你指定的每一个远程服务器的简写

git remote -v 会显示简写与其对应的 URL。

$ git remote
origin
$ git remote -v
origin        https://github.com/schacon/ticgit (fetch)
origin        https://github.com/schacon/ticgit (push)

添加远程仓库

git remote add <shortname> <url> 添加一个新的远程 Git 仓库,同时指定一个简写,用于后续指令来操作这个仓库。

$ git remote add pb https://github.com/paulboone/ticgit
$ git remote -v
origin        https://github.com/schacon/ticgit (fetch)
origin        https://github.com/schacon/ticgit (push)
pb        https://github.com/paulboone/ticgit (fetch)
pb        https://github.com/paulboone/ticgit (push)

从远程仓库中抓取与拉取

git fetch [remote-name],将数据拉取到你的本地仓库,它并不会自动合并或修改你当前的工作,

可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支

 git fetch pb

推送到远程仓库

git push [remote-name] [branch-name]

master 分支推送到 origin 服务器时

$ git push origin master

默认情况下,不用加参数 ,上传那些之前从远端 clone 下来的分支。

而如果需要push本地的自己创建的分支,则需要手动指定目标仓库和目标分支。

可以通过git config 指令来设置push.default 的值为current,这样会默认推送当前分支到远程仓库中与其同名的分支,如果远程分支不存在,Git 会自动创建它。

远程仓库的移除与重命名

pb 重命名为 paul

$ git remote rename pb paul
$ git remote
origin
paul

移除一个远程仓库

$ git remote rm paul
$ git remote
origin

Git 分支

分支创建

git branch 创建 一个新分支,不会自动切换到新分支中去。

$ git branch testing

分支切换

$ git checkout testing

想要新建一个分支并同时切换到那个分支上

$ git checkout -b iss53
Switched to a new branch "iss53"

分支合并

git merge 命令

$ git checkout master
$ git merge hotfix
遇到冲突时的分支合并

出现冲突的文件内容会包含一些特殊区段,上面的的是当前分支,下方的是合入分支,保留需要的最终内容

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> iss53:index.html

对每个文件使用 git add 命令来将其标记为冲突已解决。 一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。再输入 git commit 来完成合并提交

放弃合并

通过git merge --abort恢复到合并开始之前的状态,如果合并已经完成(即已经通过 git commit 提交了合并结果),需要通过撤销git commit指令来完成。

删除分支

git branch -d 安全删除分支,只有在分支已经被完全合并时才会成功

git branch -D 强制删除分支,无论是否已经被合并

$ git branch -d hotfix

查看分支

git branch 命令不加任何参数运行它,会得到当前所有分支的一个列表:* 字符:表示当前分支

$ git branch
* iss53
master
testing

添加参数--merged--no-merged 可以过滤已经合并或尚未合并到当前分支的分支。

远程分支

当通过命令同步远程仓库的分支状态时,它们会自动移动,它们以 (remote)/(branch) 形式命名,它们是你不能移动的本地引用。

拉取

git fetch origin 命令。 这个命令查找 “origin” 是哪一个服务器,从中抓取本地没有的数据,并且更新本地数据库,移动 origin/master 指针指向新的、更新后的位置。

推送

运行 git push (remote) (branch):

$ git push origin serverfix

你也可以运行 git push origin serverfix:serverfix

Git 自动将 serverfix 分支名字展开为 refs/heads/serverfix:refs/heads/serverfix,意味着,“推送本地的 serverfix 分支来更新远程仓库上的 serverfix 分支。

下一次其他协作者从服务器上抓取数据时,他们会在本地生成一个远程分支 origin/serverfix,指向服务器的 serverfix 分支的引用:

如果并不想让远程仓库上的分支叫做 serverfix,可以运行 git push origin serverfix:awesomebranch 来将本地的 serverfix 分支推送到远程仓库上的 awesomebranch 分支。

要特别注意的一点是当抓取到新的远程跟踪分支时,本地不会有一个新的 serverfix 分支 - 只有一个不可以修改的 origin/serverfix 指针。

可以运行 git merge origin/serverfix 将这些工作合并到当前所在的分支。

如果想要在自己的 serverfix 分支上工作,可以将其建立在远程跟踪分支之上:

$ git checkout -b serverfix origin/serverfix

这会给你一个用于工作的本地分支,并且起点位于 origin/serverfix

设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支,你可以在任意时间使用 -u--set-upstream-to 选项运行 git branch 来显式地设置。

$ git branch -u origin/serverfix

如果想要查看设置的所有跟踪分支,可以使用 git branch-vv 选项。 这会将所有的本地分支列出来并且包含更多的信息,如每一个分支正在跟踪哪个远程分支与本地分支是否是领先、落后或是都有。

$ git branch -vv
iss53     7e424c3 [origin/iss53: ahead 2] forgot the brackets
master    1ae2a45 [origin/master] deploying index fix
serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] this should do it
testing   5ea463a trying something new

iss53 分支正在跟踪 origin/iss53 并且 本地有两个提交还没有推送到服务器上。

master 分支正在跟踪 origin/master 分支并且是最新的。

serverfix 分支正在跟踪 teamone 服务器上的 server-fix-good 分支并且领先 2 落后 1,意味着服务器上有一次提交还没有合并入同时本地有三次提交还没有推送。

testing 分支并没有跟踪任何远程分支。

需要重点注意的一点是这些数字的值来自于你从每个服务器上最后一次抓取的数据。 这个命令并没有连接服务器,它只会告诉你关于本地缓存的服务器数据。 如果想要统计最新的领先与落后数字,需要在运行此命令前抓取所有的远程仓库。 可以像这样做:

$ git fetch --all
$ git branch -vv

git pull

git pull 在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令

删除远程分支

假设你已经通过远程分支做完所有的工作了,可以运行带有 --delete 选项的 git push 命令来删除一个远程分支。 如果想要从服务器上删除 serverfix 分支,运行下面的命令:

$ git push origin --delete serverfix

基本上这个命令做的只是从服务器上移除这个指针。 Git 服务器通常会保留数据一段时间直到垃圾回收运行。

变基

假设现在有dev和master分支。

可以通过在dev分支上执行git rebase master,将dev分支的提交在基于最新的master节点提交,如果git rebase中有冲突,需要像merge一样,解决冲突并提交,然后再执行git rebase --continue就行。变基完后,看分支记录,这些dev分支的commit就像都在master上提交一样。

但是master分支指针还是指向变基前的master节点。

所以如果需要将dev分支合入master,还需要再执行git merge dev,这时,dev和master分支就都指向了最新的代码节点。

不要对在你的仓库外有副本的分支执行变基。即如果本例的 dev 分支,团队里的其它伙伴也在使用,因为更改了dev分支的历史,他们因此将不得不和你的提交进行整合。

标签

列出标签

按照字母顺序进行排序

$ git tag
v0.1
v1.3

可以使用git tag -l "pattern"命令来查找符合特定模式的标签,其中pattern可以是包含通配符的字符串

$ git tag -l 'v1.8.5*'
v1.8.5
v1.8.5-rc0

创建标签

有两种类型的标签:轻量标签与附注标签

一个轻量标签很像一个不会改变的分支 - 它只是一个特定提交的引用。

附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;

附注标签

在运行 tag 命令时指定 -a

$ git tag -a v1.4 -m 'my version 1.4'
$ git tag
v0.1
v1.3
v1.4

使用 git show 命令可以看到标签信息与对应的提交信息:

$ git show v1.4
tag v1.4
Tagger: Ben Straub 
ben@straub.cc
Date:   Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon 
schacon@gee-mail.com
Date:   Mon Mar 17 21:52:11 2008 -0700
    changed the version number

轻量标签

轻量标签,不需要使用 -a-s-m 选项,只需要提供标签名字,没有保存任何其他信息

$ git tag v1.4-lw
$ git tag
v0.1
v1.3

这时,如果在标签上运行 git show,你不会看到额外的标签信息。 命令只会显示出提交信息:

$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon 
schacon@gee-mail.com
Date:   Mon Mar 17 21:52:11 2008 -0700
    changed the version number

对过去的提交打 标签,在命令的末尾指定提交的哈希值

$ git tag -a v1.2 9fceb02

推送标签

git push 命令并不会推送标签到远程仓库服务器上。可以运行 git push origin [tagname]

$ git push origin v1.5

如果要一次性推送很多标签,使用带有 --tags 选项的 git push 命令。会把所有不在远程仓库服务器上的标签全部推送。

$ git push origin --tags

检出标签

使用 git checkout 检出标签会将 HEAD 置于“分离 HEAD 状态”(detached HEAD state),这意味着你目前不在任何分支上,你可以查看和测试代码,但不能直接在这个状态下进行提交(因为没有分支可以关联这些提交)。

如果你希望在检出标签的基础上继续开发,可以使用 git checkout -b [branchname] [tagname] 在特定的标签上创建一个新分支:

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

如果在这之后又进行了一次提交,version2 分支会因为改动向前移动了,那么 version2 分支就会和 v2.0.0 标签不同了。

Git 别名

比如:配置下面指令,后面要输入 git commit 时,只需要输入 git ci

 git config --global alias.ci commit

比如:添加一个 last 命令,后面输入git last就可以看到最后一次提交

$ git config --global alias.last 'log -1 HEAD'
$ git last
commit 66938dae3329c7aebe598c2246a8e6af90d04646
Author: Josh Goebel 
dreamer3@example.com
Date:   Tue Aug 26 19:48:51 2008 +0800
    test for current head
    Signed-off-by: Scott Chacon schacon@example.com

作者和提交者的差别

作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。 所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。