Git系统总结学习(二)

远程分支

查看当前的远程库

查看当前配置有哪些远程仓库,可以用 git remote 命令,它会列出每个远程库的简短名字。在克隆完某个
项目后,至少可以看到一个名为 origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库:

git remote
// 显示对应的克隆地址
git remote -v

添加远程仓库

要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行 git remote add [shortname] [url],现在,我们为gitDemo添加远程仓库:

~/Desktop/gitDemo(master*) » git add origin git@github.com:smileasy/GitLearn.git                                                liuxingxing@liuxingxingdeMacBook-Pro
fatal: pathspec 'origin' did not match any files
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
~/Desktop/gitDemo(master*) » git remote add origin git@github.com:smileasy/GitLearn.git                                         liuxingxing@liuxingxingdeMacBook-Pro
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
~/Desktop/gitDemo(master*) » git remote                                                                                         liuxingxing@liuxingxingdeMacBook-Pro
origin
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
~/Desktop/gitDemo(master*) » git remote -v                                                                                      liuxingxing@liuxingxingdeMacBook-Pro
origin    git@github.com:smileasy/GitLearn.git (fetch)
origin    git@github.com:smileasy/GitLearn.git (push)

此时我想将代码提交到远程仓库,直接运行git push提示报错:

~/Desktop/gitDemo(master) » git push                                                                                            liuxingxing@liuxingxingdeMacBook-Pro
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin master

根据提示信息,使用git push –set-upstream origin master:

~/Desktop/gitDemo(master) » git push --set-upstream origin master                                                               liuxingxing@liuxingxingdeMacBook-Pro
Enumerating objects: 27, done.
Counting objects: 100% (27/27), done.
Delta compression using up to 12 threads
Compressing objects: 100% (19/19), done.
Writing objects: 100% (27/27), 46.25 KiB | 9.25 MiB/s, done.
Total 27 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To github.com:smileasy/GitLearn.git
 * [new branch]      master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

从远程仓库抓取数据

用下面的命令从远程仓库抓取数据到本地:

git fetch [remote-name]

此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。git fetch origin 会抓取从你上 次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要, 需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好 了,才能手工合并。更多的是,可以使用 git pull 命令 自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快 且好。

推送数据到远程仓库

使用git push [remote-name] [branch-name]可以将本地仓库中的数据推送到远程仓库.

git push origin master

查看远程仓库信息

我们可以通过命令 git remote show [remote-name] 查看某个远程仓库的详细信息:

~/Desktop/gitDemo(master) » git remote show                                                       liuxingxing@liuxingxingdeMacBook-Pro
origin
---------------------------------------------------------------------------------------------------------------------------------------
~/Desktop/gitDemo(master) » git remote show origin                                                liuxingxing@liuxingxingdeMacBook-Pro
* remote origin
  Fetch URL: git@github.com:smileasy/GitLearn.git
  Push  URL: git@github.com:smileasy/GitLearn.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

最后两行告诉我们,运行 git push 时缺省推送的分支是什么.

远程仓库的删除和重命名

我们现在只有一个master分支,如果要测试远程仓库的删除和重命名,则需要先创建新的分支test.我们需要先checkout 一个新的本地分支,然后再关联一个远程分支:

~/Desktop/gitDemo(master) » git checkout -b test                                   liuxingxing@liuxingxingdeMacBook-Pro
Switched to a new branch 'test'
------------------------------------------------------------------------------------------------------------------------
~/Desktop/gitDemo(test) » git push -u origin test                                  liuxingxing@liuxingxingdeMacBook-Pro
Total 0 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'test' on GitHub by visiting:
remote:      https://github.com/smileasy/GitLearn/pull/new/test
remote:
To github.com:smileasy/GitLearn.git
 * [new branch]      test -> test
Branch 'test' set up to track remote branch 'test' from 'origin'.

-u 参数表示将本地的dev分支和远程的origin/dev分支之间建立跟踪关联。

查看远程分支列表:

git branch -r

用 git remote rename 命令修改某个远程仓库的简短名称,比如想把 test分支 改成 dev_test,可以这么运行:

~/Desktop/gitDemo(test) » git remote rename test dev_test                                                        liuxingxing@liuxingxingdeMacBook-Pro
fatal: No such remote: 'test'

移除 对应的远端仓库(删除分支dev_leg_0923):

 git push origin --delete dev_leg_0923

更改分支名称(将dev_leg分支改名为dev_liuxingxing):

git branch -m dev_leg dev_liuxingxing
git push origin dev_liuxingxing

打标签

我们在发布某个软件版本的时候,经常需要打标签.

列显已有的标签

git tag

在 Git 自身项目仓库中,有着超过 240 个标签,如果你 只对 1.4.2 系列的版本感兴趣,可以运行下面的命令:

git tag -l 'v1.4.2.*'

新建标签

Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不 会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立 对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使 用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当 然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。

含附注的标签

创建一个含附注类型的标签非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可:

git tag -a release1.0 -m '发布1.0版本到生产环境'

而 -m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果在此选项后没有给出具 体的说明内容,Git 会启动文本编辑软件供你输入。

可以使用 git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。

git show release1.0

签署标签

如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s (译注: 取 Signed 的首 字母)即可:

git tag -s release1.1 -m '使用私钥打标签'

此条命令我并没有验证

轻量级标签

轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a,-s 或 -m 选项都不用,直接给出标签名字即可:

git tag v1.4-lw

后期加注标签

你甚至可以在后期对早先的某次提交加注标签 :

git log --pretty=oneline   //获取校验和
git tag -a version1.2 ab2205fca1   //为指定的提交打上version1.2标签

分享标签

默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其 命令格式如同推送分支,运行 git push origin [tagname] 即可:

~/Desktop/gitDemo(devtest*) » git push origin version1.2                                                    liuxingxing@liuxingxingdeMacBook-Pro
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 186 bytes | 186.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To github.com:smileasy/GitLearn.git
 * [new tag]         version1.2 -> version1.2

如果要一次推送所有(本地新增的)标签上去,可以使用 –tags 选项:

~/Desktop/gitDemo(devtest*) » git push origin --tags                                                        liuxingxing@liuxingxingdeMacBook-Pro
Total 0 (delta 0), reused 0 (delta 0)
To github.com:smileasy/GitLearn.git
 * [new tag]         list -> list
 * [new tag]         show -> show

技巧和窍门

Git 命令别名

git config --global alias.co checkout
git config --global alias.sta status

取消暂存文件时的输入比较繁琐,可以自己设置一下 :

git config --global alias.unstage 'reset HEAD' 

使用:

~/Desktop/gitDemo(devtest*) » git config --global alias.unstage 'reset HEAD'                                liuxingxing@liuxingxingdeMacBook-Pro
-------------------------------------------------------------------------------------------------------------------------------------------------
~/Desktop/gitDemo(devtest*) » git status                                                                    liuxingxing@liuxingxingdeMacBook-Pro
On branch devtest
Your branch is up to date with 'origin/devtest'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   git

-------------------------------------------------------------------------------------------------------------------------------------------------
~/Desktop/gitDemo(devtest*) » git unstage git                                                               liuxingxing@liuxingxingdeMacBook-Pro
-------------------------------------------------------------------------------------------------------------------------------------------------
~/Desktop/gitDemo(devtest*) » git sta                                                                       liuxingxing@liuxingxingdeMacBook-Pro
On branch devtest
Your branch is up to date with 'origin/devtest'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    git

nothing added to commit but untracked files present (use "git add" to track)

如果文件已经处于可以被commit的状态,需要你先reset HEAD掉文件,使文件处于未存储的状态,然后才能通过git checkout – 文件名 来丢弃对文件的修改. git config –global alias.unstage ‘reset HEAD’ 相当于以下2个命令:

git unstage fileA
$ git reset HEAD fileA

另外,我们还经常设置 last 命令 来看最后一次的提交信息 :

git config --global alias.last 'log -1 HEAD'

   转载规则


《Git系统总结学习(二)》 刘星星 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Git系统总结学习(三) Git系统总结学习(三)
Git 分支我们知道,Git 保存的不是文件差异或者变化量,而只是一系列文件快照。 在 Git 中提交时,会保存一个提交(commit)对象,它包含一个指向暂存内容快照的指针,作者和相关附 属信息,以及一定数量(也可能没有)指向该提交
2017-06-06
下一篇 
Git系统总结学习(一) Git系统总结学习(一)
基本概念使用Git时,对于任何一个文件,在 Git 内都只有三种状态:已提交 (committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没
2017-06-01
  目录