设为首页 收藏本站
查看: 1021|回复: 0

[经验分享] git 有用却易忘的知识与命令

[复制链接]

尚未签到

发表于 2018-9-17 08:25:05 | 显示全部楼层 |阅读模式
更改user信息

  •   重新设置user.name和user.email配置变量。
      因为gotgithub是一个仅在本书使用的示例账号,我可不想影响本地其他项目的提交,因此下面的设置命令没有使用--global参数,只对本地版本库进行设置。
      $ git config user.name "Jiang Xin"
      $ git config user.email "gotgithub@gmail.com"
      多次设置可覆盖与更新

更改 commit 信息

  •   commit日志log有时间、提交人员与邮箱参数
      本地commit之后想变更log里的邮箱与人员

    •   按照1>里的重新设定user.name和user.email
    •   使用git commit修正命令:git commit --amend --reset-author -C HEAD
        --amend:修正
        --reset-author可选参数:只修正author人员与邮箱。不添加此参数则不更新user的参数
        -C HEAD:维持(continue)提交说明(-m)信息不变
        不加参数则是修改commit的 comment 信息
    •   log或者reflog的--pretty=fuller可以查看提交的详细日志
        --pretty=oneline可以查看提交的简要日志(只有版本号)

Already up-to-date

  •   注意:git是根据commit的先后,或者说 更改 来决定新旧
      而不是内容
      例如:
      本地删除全部文件,做了提交,那么本地旧领先远程一个提交,本地分支就是新于远程分支
强制推送

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

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

  •   创建分支并转到该分支:git checkout -b newbranch
      默认是在当前分支的最新提交的基础上新建分支
  •   git checkout -b newbranch basebranch:在指定的basebranch分支的最新提交点的基础上新建分支
  •   git checkout -b newBrach [originName]/[remoteBranch]
      在远程某分支的最新提交的基础上(如果该分支已fetch保存在.git仓库里的话)新建分支,但是不建立对应的追踪关系
分支追踪

  •   git clone时只在本地创建与远程同名的默认分支,并建立追踪关系
  •   工作区新建的分支需要与远程分支建立关系时:
      git branch --set-upstream [branchName] [originName]/[remoteBranchName]
      将本地分支与远程某分支建立追踪关系(并没有要求名字必须相同)
      有两个参数
  •   git branch --track [originName]/[remoteBranchName]
      将自己当前工作分支与某远程分支建立联系
      git branch --set-upstream-to [originName]/[remoteBranchName]
      只有一个参数
  •   git push -u [originName] [branchName]:[remoteBranchName]
      是先建立[branchName]:[remoteBranchName]追踪对应关系,再把本地更新推上去
      省略[branchName]则代表是当前工作分支
      -u参数是upstream的意思
  •   git pull -u [originName] [branchName]:[remoteBranchName]
      只负责拉下某个远程分支的更新到本地某分支,但是 无法建立追踪关系
  •   git push、git pull、git push --all
      这些缺省指定分支和参数的命令最好在已经指定了追踪关系后使用
      其中:1,2,3,4可建立追踪关系
  git是如何知道本地分支与远程分支的跟踪关联关系的?
  In later versions of Git, after about
  1.6.6 or so, Git makes it very easy to create a local- and remote-tracking branch pair
  using a consistent ref name for them.
  本语句来源于Oreilly《Version Control with Git 2012》P227
  git1.6.6以后,git使用本地分支和远程分支一致的ref名字跟踪关联
  键入 git branch -vv查看本地分支和远程分支的跟踪关联关系
查看分支追踪对应情况
  git branch -vv
// output* dev    080235f [temp/dev] add 2 line_dev  master cc4a3f1 [temp/master] add 2 line  或者采用cat .git/config或者git config --list
[remote "temp"]    url = git@github.com:yangfch3/temp.git    fetch = +refs/heads/*:refs/remotes/temp/*// 远程分支信息[branch "master"]    remote = temp    merge = refs/heads/master[branch "dev"]    remote = temp    merge = refs/heads/dev// master和dev的分支追踪情况创建一个新的空分支
git symbolic-ref HEAD refs/heads/newbranch rm .git/indexgit clean -fdx本地与远程分支数量的同步

  •   情景1:本地有分支,把分支更新推送到远程版本库(远程版本库还没有对应的分支)
      git push -u origin newbranch
      -u参数的作用:
      本地新建分支,远程仓库并没有该新分支,-u代表的意思:1.在远程仓库创建新版本库:newbranch;2.将本地新分支与新建的远程分支建立联系;3.push新分支上的文件上远程新分支去

  •   情景2:远程有分支,本地还没有创建对应的分支
      方案一:


  •   在现有分支的基础上新建分支:见上方创建分支
  •   创建一个新的空分支
      git symbolic-ref HEAD refs/heads/newbranch
      rm .git/index
      git clean -fdx

  •   本地新建分支
  •   取回远程分支的代码
      git pull [originName] [remoteBranchNaem]
      这样就能在本地创建一个全新的分支且与远程同步并不发生冲突了
  情景3:本地和远程都没分支 ===> 划归到情景 1 或 2情景4:本地和远程有相同数量的分支 ===> 建立分支追踪即可
删除本地分支和远程分支

  •   删除本地分支:
      $ git branch -D mybranch1
  •   删除远程分支:
      git push [originName] --delete [branchName]
  •   如何在本地删除分支后,使远程的该分支也得到删除?
      再使用下面的命令删除远程分支
      $ git push origin :mybranch1
      相当于把一个空的分支推送到远程分支上,达到删除的目的
      注意:不能删除设置的默认分值,删除时会报错


  •   To git@github.com:gotgithub/helloworld.git
  •    - [deleted]         mybranch1
  如何在删除远程分支后,使本地分支也得到删除?$ git pull -p [origin] 远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。 加上参数 -p 就会在本地删除远程已经删除的分支。
获取仓库和分支信息的一些命令

  •   git branch -a [-v]:all,可选-v参数
  •   git branch -r [-v]:remote,可选-v参数
  •   git branch -v:verbose(冗长的)
  •   git remote:
  •   git remote -v:verbose(冗长的)
  •   git remote show [originName]:查看某远程源的超详细信息
多个远端仓库源
  一个本地仓库可以添加多个远程仓库源,为了辨识,请为源的名字语义化命名。
  git remote add [originName] [repoLocation]
里程碑(标签)管理:
  在很多时候我们需要为代码的版本打上标签。需要的时候我们可以将代码回滚到特定的版本。
  本地git的tag命令用于操作代码的标签。git的tag可以视为版本库的一个快照,他的本质也是将一个版本的指针固定的指向某个commit指针。

  •   创建标签:
      首先切换到需要打标签的分支:
      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]:查看

  •   操作标签


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

  •   git config --global alias.[orderAbbrev] [orderNormal]:个性化配置长命令成短命令
  •   git config --global color.ui true:使 git 命令行显示不同的颜色
  •   当前用户的Git全局配置文件放在用户主目录下的一个隐藏文件.gitconfig中,可以直接修改进行配置

    •   [user]
    •       name = yangfch3
    •       email = yangfch3@gmail.com
    •   [color]
    •       ui = true
    •   [alias]
    •       co = checkout

  •   每个仓库的配置文件放置在 .git/config 文件下,可手动修改,也可用命令行生成
      $ cat .git/config

    •   [core]
    •       repositoryformatversion = 0
    •       filemode = true
    •       bare = false
    •       logallrefupdates = true
    •       ignorecase = true
    •       precomposeunicode = true
    •   [remote "origin"]
    •       url = git@github.com:michaelliao/learngit.git
    •       fetch = +refs/heads/*:refs/remotes/origin/*
    •   [branch "master"]
    •       remote = origin
    •       merge = refs/heads/master
    •   [branch "dev"]
    •       remote = origin
    •       merge = refs/heads/dev
    •   [alias]
    •       last = log -1

指定参数的 git clone
  git clone -o [originName] [gitLocation] [dirName]
  从[gitLocation]地址克隆仓库到[dirName]文件夹,并建立本地仓库与远程仓库联系,加-o参数可以命名远程仓库源的名字
// 例如git clone -o jquery git@github.com:jquery/jquery.git myjquery普通合并时可以标记 comment
  git merge [branchName] --no-ff -m "[comment]":--no-ff模式合并,并书写commit说明
fetch 用法与三处分支关系图

  •   三处分支关系图
  •   git fetch 用于取回更新

  •   取回远程所有分支的更新
      $ git fetch [originName]:参数是远程源名
      用于取回该远程源所有的更新
      注意:取回的更新是是放在.git\refs\remotes\origin目录下,打开该目录可看到远程源的所有分支
      ---dev
      ---master
      ---...

  •   取回远程特定分支的更新
      $ git fetch [originName] [branchName]


  •   注意:虽然我们取回了更新,fetch取回的之后的更新的保存位置保存在.git\refs\remotes\origin目录下,那么如何恢复这些更新到工作区呢?
  •   同步工作区与.git仓库

  •   工作区为空,以fetch回来的某分支的更新在工作区新建分支,并自动与该远程分支建立追踪关系
      git checkout -b [newBranch] [originName]/[remoteBranchName]
      上面命令表示,在originName/remoteBranchName的基础上,创建一个新分支,并建立追踪关系。

  •   git merge [originName]/[branchName]
      合并远程分支的更新到当前工作分支(但不建立追踪关系)
git pull 详解

  •   $ git pull  :
      git pull的标准命令格式
  •   git pull [originName] [remoteBranch]:[branch]的作用与git fetch再merge 相近。先取回某分支更新再合并。
  •   如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
      git pull [originName] [branch]
  •   如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名
      $ git pull [originName]
  •   当前分支只有一个追踪分支,连远程主机名都可以省略。
      git pull
git push 详解

  •   git push  :
  •   省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常设定为两者同名)
      git push [origin] [branch]
  •   省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支
      git push [origin] :[remoteBranch]
  •   删除远程分支:
      git push [origin] --delete [remoteBranch]
  •   当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略
      git push [origin]
  •   当前分支只有一个追踪分支,那么主机名都可以省略
      git push
  •   如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。
      git push -u origin master
  •   simple模式---不带任何参数的git push,默认只推送当前分支
      matching模式---不带任何参数的git push会推送所有有对应的远程分支的本地分支
      Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config修改:git config --global push.default matching/simple
  •   git push --force origin
      如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用--force选项。
      上面命令使用--force选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用--force选项。
      常用的情景:别人上传了错误的更新,导致无法push时
推送全部分支更新到远程分支
  除了推送单个分支的更新,还可以使用以下命令一并推送所有分支更新,前提是:已经为分支们建立好了追踪关系

  •   git push --all
      将所有本地分支更新推送到远程仓库源,前提是:本地所有分支已经和远程建立了追踪关系
  •   git push --all [originName]
      多个远程源,只想更新一个远程源的时候使用



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-588048-1-1.html 上篇帖子: Git 基本命令 下篇帖子: Git:导入外部仓库至托管平台
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表