[关闭]
@yangfch3 2016-02-25T17:53:54.000000Z 字数 6347 阅读 7293

git 有用却易忘的知识与命令

git


更改user信息

  1. 重新设置user.nameuser.email配置变量。

    因为gotgithub是一个仅在本书使用的示例账号,我可不想影响本地其他项目的提交,因此下面的设置命令没有使用--global参数,只对本地版本库进行设置

    $ git config user.name "Jiang Xin"
    $ git config user.email "gotgithub@gmail.com"

    多次设置可覆盖与更新


更改 commit 信息

  1. commit日志log时间、提交人员与邮箱参数

    本地commit之后想变更log里的邮箱与人员

    1. 按照1>里的重新设定user.nameuser.email
    2. 使用git commit修正命令:git commit --amend --reset-author -C HEAD
      --amend:修正
      --reset-author可选参数:只修正author人员与邮箱。不添加此参数则不更新user的参数
      -C HEAD:维持(continue)提交说明(-m)信息不变

      不加参数则是修改commit的 comment 信息

    3. log或者reflog--pretty=fuller可以查看提交的详细日志
      --pretty=oneline可以查看提交的简要日志(只有版本号)

Already up-to-date

  1. 注意:git是根据commit的先后,或者说 更改 来决定新旧
    而不是内容

    例如:
    本地删除全部文件,做了提交,那么本地旧领先远程一个提交,本地分支就是新于远程分支


强制推送

  1. git push -f强制推送用于自己很明确报了无意义错时采用
    平时不提倡使用,会导致代码版本错乱

分支保存位置

  1. Git的分支就是保存在.git/refs/heads/命名空间下的引用。当前版本库中的默认分支master就对应于文件.git/refs/heads/master

创建分支

  1. 创建分支并转到该分支:git checkout -b newbranch
    默认是在当前分支的最新提交的基础上新建分支

  2. git checkout -b newbranch basebranch:在指定的basebranch分支的最新提交点的基础上新建分支

  3. git checkout -b newBrach [originName]/[remoteBranch]
    远程某分支的最新提交的基础上(如果该分支已fetch保存在.git仓库里的话)新建分支,但是不建立对应的追踪关系


分支追踪

  1. git clone时只在本地创建与远程同名的默认分支,并建立追踪关系

  2. 工作区新建的分支需要与远程分支建立关系时:
    git branch --set-upstream [branchName] [originName]/[remoteBranchName]
    将本地分支与远程某分支建立追踪关系(并没有要求名字必须相同

    有两个参数

  3. git branch --track [originName]/[remoteBranchName]
    将自己当前工作分支与某远程分支建立联系
    git branch --set-upstream-to [originName]/[remoteBranchName]

    只有一个参数

  4. git push -u [originName] [branchName]:[remoteBranchName]
    是先建立[branchName]:[remoteBranchName]追踪对应关系,再把本地更新推上去

    省略[branchName]则代表是当前工作分支

    -u参数是upstream的意思

  5. git pull -u [originName] [branchName]:[remoteBranchName]
    只负责拉下某个远程分支的更新到本地某分支,但是 无法建立追踪关系

  6. git pushgit pullgit push --all
    这些缺省指定分支和参数的命令最好在已经指定了追踪关系后使用

    其中:1,2,3,4可建立追踪关系


查看分支追踪对应情况

git branch -vv

  1. // output
  2. * dev 080235f [temp/dev] add 2 line_dev
  3. master cc4a3f1 [temp/master] add 2 line

或者采用cat .git/config或者git config --list

  1. [remote "temp"]
  2. url = git@github.com:yangfch3/temp.git
  3. fetch = +refs/heads/*:refs/remotes/temp/*
  4. // 远程分支信息
  5. [branch "master"]
  6. remote = temp
  7. merge = refs/heads/master
  8. [branch "dev"]
  9. remote = temp
  10. merge = refs/heads/dev
  11. // master和dev的分支追踪情况

创建一个新的空分支

  1. git symbolic-ref HEAD refs/heads/newbranch
  2. rm .git/index
  3. git clean -fdx

本地与远程分支数量的同步


删除本地分支和远程分支


获取仓库和分支信息的一些命令


多个远端仓库源

一个本地仓库可以添加多个远程仓库源,为了辨识,请为源的名字语义化命名。
git remote add [originName] [repoLocation]


里程碑(标签)管理:

在很多时候我们需要为代码的版本打上标签。需要的时候我们可以将代码回滚到特定的版本。

本地gittag命令用于操作代码的标签。gittag可以视为版本库的一个快照,他的本质也是将一个版本的指针固定的指向某个commit指针。

  1. 创建标签:

    首先切换到需要打标签的分支:
    git branch
    git checkout master

    找到对应需要打标签的commit点:
    git log --pretty=oneline --abbrev-commit

    git reflog

    新建标签(简单标签):
    git tag [tagName]:默认在当前commit点打标签[tagName]
    git tag [tagName] [commitID]:在对应的commitID打标签[tagName]
    git tag -a [tagName] -m "[comment]" [commitID]:在commitID下创建[tagName],并书写版本说明

    查看标签:
    git tag:查看以ASCII码排序的标签列表
    v0.9
    v1.0
    git show [tagName]:查看

  2. 操作标签

    • 同步标签到远程
      git push origin [tagName]:推送某个标签到远程仓库
      git push origin --tags:一次性推送所有tag更新到远程仓库
    • 删除标签
      git tag -d [tagName]:删除本地tag
      git push origin :refs/tags/[tagName]:删除本地tag后删除远程仓库对应的tag

git 个性化配置

  1. git config --global alias.[orderAbbrev] [orderNormal]:个性化配置长命令成短命令

  2. git config --global color.ui true:使 git 命令行显示不同的颜色

  3. 当前用户的Git全局配置文件放在用户主目录下的一个隐藏文件.gitconfig中,可以直接修改进行配置

    1. [user]
    2. name = yangfch3
    3. email = yangfch3@gmail.com
    4. [color]
    5. ui = true
    6. [alias]
    7. co = checkout
  4. 每个仓库的配置文件放置在 .git/config 文件下,可手动修改,也可用命令行生成

    $ cat .git/config

    1. [core]
    2. repositoryformatversion = 0
    3. filemode = true
    4. bare = false
    5. logallrefupdates = true
    6. ignorecase = true
    7. precomposeunicode = true
    8. [remote "origin"]
    9. url = git@github.com:michaelliao/learngit.git
    10. fetch = +refs/heads/*:refs/remotes/origin/*
    11. [branch "master"]
    12. remote = origin
    13. merge = refs/heads/master
    14. [branch "dev"]
    15. remote = origin
    16. merge = refs/heads/dev
    17. [alias]
    18. last = log -1

指定参数的 git clone

git clone -o [originName] [gitLocation] [dirName]
[gitLocation]地址克隆仓库到[dirName]文件夹,建立本地仓库与远程仓库联系,加-o参数可以命名远程仓库源的名字

  1. // 例如
  2. git clone -o jquery git@github.com:jquery/jquery.git myjquery

普通合并时可以标记 comment

git merge [branchName] --no-ff -m "[comment]"--no-ff模式合并,并书写commit说明


fetch 用法与三处分支关系图



git pull 详解

  1. $ git pull <远程主机名> <远程分支名>:<本地分支名>
    git pull的标准命令格式

  2. git pull [originName] [remoteBranch]:[branch]的作用与git fetchmerge 相近。先取回某分支更新再合并。

  3. 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
    git pull [originName] [branch]

  4. 如果当前分支与远程分支存在追踪关系git pull就可以省略远程分支名
    $ git pull [originName]

  5. 当前分支只有一个追踪分支,连远程主机名都可以省略。
    git pull


git push 详解

  1. git push <远程主机名> <本地分支名>:<远程分支名>

  2. 省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常设定为两者同名)
    git push [origin] [branch]

  3. 省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支
    git push [origin] :[remoteBranch]

  4. 删除远程分支:
    git push [origin] --delete [remoteBranch]

  5. 当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略
    git push [origin]

  6. 当前分支只有一个追踪分支,那么主机名都可以省略
    git push

  7. 如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push
    git push -u origin master

  8. simple模式---不带任何参数的git push,默认只推送当前分支

    matching模式---不带任何参数的git push推送所有有对应的远程分支的本地分支

    Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config修改:git config --global push.default matching/simple

  9. git push --force origin
    如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用--force选项。
    上面命令使用--force选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用--force选项。
    常用的情景:别人上传了错误的更新,导致无法push

推送全部分支更新到远程分支

除了推送单个分支的更新,还可以使用以下命令一并推送所有分支更新,前提是:已经为分支们建立好了追踪关系

  1. git push --all
    将所有本地分支更新推送到远程仓库源,前提是:本地所有分支已经和远程建立了追踪关系

  2. git push --all [originName]
    多个远程源,只想更新一个远程源的时候使用


参考学习链接:
git 教程_廖雪峰
git使用练习
GotGithub_@Jiang Xin


git 命令查询表
Git cheat sheet.jpg-405.4kB

Git cheat sheet 2.jpg-346.9kB

Git cheat sheet 3.jpg-367.7kB

Git Supervisual cheat sheet.jpg-231.1kB

Git常用命令.jpg-648.8kB

gitOnePic.png-255.5kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注