git基础总结


git基础总结

git基础总结

在工作目录中初始化新仓库:$ git init

将文件添加到git:

格式:$ git add

举例:

$ git add *.c

$ git add README

提交文件到git:

格式:$ git commit [-m '备注']

举例:$ git commit -m 'initial project version'

设置自己喜欢的编辑软件:默认会启用 shell 的环境变量 $EDITOR 所指定的软件,一般都是 vim 或 emacs。

git config --global core.editor

从仓库克隆到本地的命令:

格式:$ git clone [url] [folder_path]

举例:$ git clone git://github.com/schacon/grit.git demo_folder

查看分支:

格式:$ git branch [-a]

举例(所有分支):$ git branch -a

举例(本地分支):$ git branch

检查当前文件状态:$ git status

查看具体修改了什么地方:$ git diff

查看已经暂存起来的文件和上次提交时的快照之间的差异:$ git diff --cached

Git>=1.6.1还允许使用(效果是相同的):$ git diff --staged

git获取帮助

格式:$ git help

举例:要学习config命令可以怎么用,运行:$ git help config

格式:$ git --help

举例:$ git config --help

格式:$ man git-

举例:$ man git-config

按q退出

忽略文件

忽略某些文件:创建.gitignore文件

内容举例:

$ cat .gitignore

*.[oa] #告诉 Git 忽略所有以 .o 或 .a 结尾的文件

*~ #告诉 Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本

#此为注释 – 将被 Git 忽略

#忽略所有 .a 结尾的文件

*.a

#但 lib.a 除外

!lib.a

#仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO

/TODO

#忽略 build/ 目录下的所有文件

build/

#会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

doc/*.txt

#忽略 doc/ 目录下所有扩展名为 txt 的文件

doc/**/*.txt

**\通配符从 Git 版本 1.8.2 以上已经可以使用。


跳过使用暂存区域:$ git commit -a -m ''


移除文件


格式:git rm [] [--] ...

查看git rm具体参数,在命令行输入:$ git rm

删除文件:$ rm grit.gemspec

移除git上的文件的操作:$ git rm grit.gemspec

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项-f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。

要移除跟踪但不删除文件:

$ git rm --cached readme.txt

也可以使用glob模式:

举例:$ git rm log/\*.log

解释:此命令删除所有log/目录下扩展名为 .log 的文件。

举例:$ git rm \*~

解释:会递归删除当前目录及其子目录中所有~结尾的文件。


移动文件


在Git中对文件改名:

举例:$ git mv file_from file_to

解释:

其实,运行git mv就相当于运行了下面三条命令:

$ mv file_from file_to

$ git rm file_from

$ git add file_to


查看提交历史


查看提交历史命令:$ git log

常用命令:

举例:$ git log -p -2

解释:常用-p选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新

仅显示简要的增改行数统计:

$ git log --stat

常用命令:

举例:$ git log --pretty=oneline

解释:常用的--pretty选项,可以指定使用完全不同于默认格式的方式展示提交历史。

--pretty的值有:oneline、short、full 、 fuller和format

oneline将每个提交放在一行显示,这在提交数很大时非常有用。

format:可以定制要显示的记录格式,这样的输出便于后期编程提取分析。

举例:$ git log --pretty=format:"%h - %an, %ar : %s"

常用的格式占位符写法及其代表的意义:

%H 提交对象(commit)的完整哈希字串

%h 提交对象的简短哈希字串

%T 树对象(tree)的完整哈希字串

%t 树对象的简短哈希字串

%P 父对象(parent)的完整哈希字串

%p 父对象的简短哈希字串

%an 作者(author)的名字

%ae 作者的电子邮件地址

%ad 作者修订日期(可以用-date=选项定制格式)

%ar 作者修订日期,按多久以前的方式显示

%cn 提交者(committer)的名字

%ce 提交者的电子邮件地址

%cd 提交日期

%cr 提交日期,按多久以前的方式显示

%s 提交说明


其他3项展示的信息或多或少有些不同,请自己动手实践一下看看效果如何。

用oneline或 format 时结合 --graph 选项,可以看到开头多出一些 ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况。在我们之前提到的 Grit 项目仓库中可以看到:

$ git log --pretty=format:"%h %s" --graph

* 2d3acf9 ignore errors from SIGCHLD on trap

*  5e3ee11 Merge branch 'master' of git://github.com/dustin/grit

|\

| * 420eac9 Added a method for getting the current branch.

* | 30e367c timeout code and tests

* | 5a09431 add timeout protection to grit

* | e1193f8 support for heads with slashes in them

|/

* d6016bc require time for xmlschema

*  11d191e Merge branch 'defunkt' into local

git log其他常用的选项及其释义:

-p 按补丁格式显示每个更新之间的差异。

--word-diff 按word diff格式显示差异。

--stat 显示每次更新的文件修改统计信息。

--shortstat 只显示--stat中最后的行数修改添加移除统计。

--name-only 仅在提交信息后显示已修改的文件清单。

--name-status 显示新增、修改、删除的文件清单。

--abbrev-commit 仅显示SHA-1的前几个字符,而非所有的 40 个字符。

--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。

--graph 显示ASCII图形表示的分支合并历史。

--pretty 使用其他格式显示历史提交信息。可用的选项包括oneline,short,full,fuller 和 format(后跟指定格式)。

--oneline --pretty=oneline --abbrev-commit的简化用法。

Git在输出所有提交时会自动调用分页程序(less),要看更早的更新只需翻到下页即可。

另外还有按照时间作限制的选项,比如--since和 --until。下面的命令列出所有最近两周内的提交:

举例:$ git log --since=2.weeks

其他常用的类似选项:

-(n) 仅显示最近的n条提交

--since, --after 仅显示指定时间之后的提交。

--until, --before 仅显示指定时间之前的提交。

--author 仅显示指定作者相关的提交。

--committer 仅显示指定提交者相关的提交。

请注意,如果要得到同时满足这两个选项搜索条件的提交,就必须用--all-match选项。否则,满足任意一个条件的提交都会被匹配出来:

例子:

$ git log --pretty="%h - %an, %ar : %s" --author=gitster --after="2008-10-01"

   --before="2008-11-01" --no-merges -- t/


撤消操作


修改最后一次提交:

$ git commit -m 'initial commit'

$ git add forgotten_file

$ git commit --amend

上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。


不小心用git add .全加到了暂存区域,取消已经暂存的文件:git status 的命令输出已经告诉了我们该怎么做:

取消暂存文件使用:git reset HEAD ...

$ git reset HEAD benchmarks.rb


取消对文件的修改,回到之前的状态,git status同样提示了具体的撤消方法


在第二个括号中,我们看到了抛弃文件修改的命令(至少在Git 1.6.1以及更高版本中会这样提示,如果你还在用老版本,我们强烈建议你升级,以获取最佳的用户体验),让我们试试看:git checkout -- ...

$ git checkout -- benchmarks.rb

远程仓库的使用

查看当前的远程库

命令:$ git remote

实现:

克隆项目$ git clone git://github.com/schacon/ticgit.git

$ cd ticgit

$ git remote

显示对应的克隆地址:

$ git remote -v

添加远程仓库

运行git remote add [shortname] [url]

$ git remote

$ git remote add pb git://github.com/paulboone/ticgit.git

$ git remote -v

现在可以用字符串pb指代对应的仓库地址了。比如说,要抓取所有 Paul 有的,但本地仓库没有的信息,可以运行 git fetch pb:

$ git fetch pb

从远程仓库抓取数据


$ git fetch [remote-name]

注意:需要记住,fetch命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。

常用:

从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。

$  git pull

推送数据到远程仓库

命令:git push [remote-name] [branch-name]

例子:

$ git push origin master

或者

$ git push


查看远程仓库信息


命令:git remote show [remote-name]

例子:

$ git remote show origin

* remote origin

  URL: git@github.com:defunkt/github.git

  Remote branch merged with 'git pull' while on branch issues

    issues

  Remote branch merged with 'git pull' while on branch master

    master

  New remote branches (next fetch will store in remotes/origin)

    caching

  Stale tracking branches (use 'git remote prune')

    libwalker

    walker2

  Tracked remote branches

    acl

    apiv2

    dashboard2

    issues

    master

    postgres

  Local branch pushed with 'git push'

    master:master


它告诉我们,运行git push时缺省推送的分支是什么(译注:最后两行)。它还显示了有哪些远端分支还没有同步到本地(译注:第六行的 caching 分支),哪些已同步到本地的远端分支在远端服务器上已被删除(译注:Stale tracking branches 下面的两个分支),以及运行 git pull 时将自动合并哪些分支(译注:前四行中列出的 issues 和 master 分支)。


远程仓库的删除和重命名


修改远程仓库在本地的简称:

格式:git remote rename

例子(想把pb改成 paul):

$ git remote rename pb paul

$ git remote


注意,对远程仓库的重命名,也会使对应的分支名称发生变化,原来的pb/master分支现在成了 paul/master。


删除对应的远端仓库,可以运行git remote rm命令:

$ git remote rm paul


打标签


列显已有的标签:

$ git tag


注意:显示的标签按字母顺序排列,所以标签的先后并不表示重要程度的轻重。


筛选标签:

$ git tag -l 'v1.4.2.*'



新建标签


一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。


轻量级的(lightweight)


创建标签:

$ git tag v1.4-lw

$ git tag


查看标签版本信息:$ git show v1.4-lw


含附注的(annotated)


创建标签:用-a(译注:取 annotated 的首字母)指定标签名字即可:

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

$ git tag

v0.1

v1.3

v1.4


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


查看相应标签的版本信息,并连同显示打标签时的提交对象:

$ git show v1.4

签署标签


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

$ git tag -s v1.5 -m 'my signed 1.5 tag'


查看标签版本信息:$ git show v1.4


验证标签


使用git tag -v [tag-name](译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证:

$ git tag -v v1.4.2.1

若是没有签署者的公钥,会报告类似下面这样的错误:

gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A

gpg: Can't check signature: public key not found

error: could not verify the tag 'v1.4.2.1'

后期加注标签

你甚至可以在后期对早先的某次提交加注标签。比如在下面展示的提交历史中:

$ git log --pretty=oneline

4682c3261057305bdd616e23b64b0857d832627b added a todo file

166ae0c4d3f420721acbb115cc33848dfcc2121a started write support

9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile

964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo

8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme


在提交“updated rakefile” 后为此项目打上版本号 v1.2


补标签:$ git tag -a v1.2 9fceb02


列显已有的标签:$ git tag


查看相应标签的版本信息,并连同显示打标签时的提交对象:$ git show v1.2


分享标签

运行git push origin [tagname]

描述:

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

$ git push origin v1.5

要一次推送所有本地新增的标签上去:

$ git push origin --tags


技巧和窍门


自动补全

如果你用的是Bash shell,可以试试看 Git 提供的自动补全脚本。下载 Git 的源代码,进入 contrib/completion 目录,会看到一个 git-completion.bash 文件。将此文件复制到你自己的用户主目录中(译注:按照下面的示例,还应改名加上点:cp git-completion.bash ~/.git-completion.bash),并把下面一行内容添加到你的 .bashrc 文件中:


source ~/.git-completion.bash


也可以为系统上所有用户都设置默认使用此脚本。Mac上将此脚本复制到 /opt/local/etc/bash_completion.d 目录中,Linux 上则复制到 /etc/bash_completion.d/ 目录中。这两处目录中的脚本,都会在 Bash 启动时自动加载。


如果在Windows上安装了 msysGit,默认使用的 Git Bash 就已经配好了这个自动补全脚本,可以直接使用。


实例:

$ git co

commit config


此例中:

linux中键入 git co 然后连按两次 Tab 键,会看到两个相关的建议(命令) commit 和 config。继而输入 m 会自动完成 git commit 命令的输入。

windows中键入 git co 然后连按两次 Tab 键,会看到命令在变,选择相应的命令即可。


实例:

比如运行git log的时候忘了相关选项的名字,可以输入开头的几个字母,然后敲 Tab 键看看有哪些匹配的:

$ git log --s


Git命令别名

取别名

例子:

$ git config --global alias.co checkout

$ git config --global alias.br branch

$ git config --global alias.ci commit

$ git config --global alias.st status

现在,如果要输入git commit只需键入 git ci 即可


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

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


这样一来,下面的两条命令完全等同:

$ git unstage fileA

$ git reset HEAD fileA


还经常设置last命令:

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


看最后一次的提交信息,就变得简单多了:

$ git last


我们希望运行某个外部命令,而非Git的子命令,这个好办,只需要在命令前加上 ! 就行。如果你自己写了些处理 Git 仓库信息的脚本的话,就可以用这种技术包装起来。作为演示,我们可以设置用 git visual 启动 gitk:


$ git config --global alias.visual '!gitk'

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,904评论 0 11
  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,855评论 5 147
  • 一、电脑本地初始化一个仓库 1. git init: 初始化一个电脑上本地仓库 终端进入项目目录,输入: 该命令将...
    dragon_li阅读 2,876评论 1 4
  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,456评论 1 26
  • 文/无忧先生 细雨拍打着干旱的大地 大地忍不住哭泣 分不清泪水还是雨滴 如此淅沥 大风猛刮着妈妈的雨衣 孩子在身后...
    无忧先生阅读 207评论 0 1