Git 使用心得

Git 命令

git --version : 查看git版本

配置 Git 环境

git config --system
git config --global
git config --local

git config 命令带上 --system、 --global、 -- local 不同的选项,意味着将配置文件放置在不同的地方,同时会读写该文件中的配置变量。system 选项配置文件在 /etc/gitconfig,针对系统上每一个用户及他们的仓库都会使用该配置文件,修改的时候需要使用管理员或超级用户权限。global 选项配置文件在 ~/.gitconfig 或 ~/.config/git/config,只针对当前用户下的仓库。local 选项配置文件在当前仓库的 .git/config,只针对该仓库。如果多个级别的配置文件同时存在,则低级别的会覆盖高级别的配置,例如 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。

配置用户名和邮件地址

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

查看配置

git config --list : 查看所有配置
git config user.name : 查看用户名的配置
git config --list --show-origin : 查看配置以及他们所在的文件

由于 Git 会从多个文件中读取同一配置变量的不同值,因此你可能会在其中看到意料之外的值而不知道为什么。 此时,你可以查询 Git 中该变量的 原始 值,它会告诉你哪一个配置文件最后设置了该值:
$ git config --show-origin rerere.autoUpdate
file:/home/johndoe/.gitconfig false

获取 Git 仓库

git init : 在已存在目录中初始化仓库

该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的Git仓库中所有的必须文件。

git remote add <shortname> <url> : 添加远程 Git 仓库,同时指定仓库名称简写
git clone <url> :克隆现有的远程仓库(url是远程仓库地址,clone 命令会自动将其添加为远程仓库并默认以 “origin” 为简写)
git clone <url> <name> :克隆现有的远程仓库的时候,自定义本地仓库的名字(name是指定的新的目录名)

Git 支持多种数据传输协议,可以使用 https:// 协议,也可以使用 git:// 或 SSH 传输协议,比如 user@server:path/to/repo.git

文件的状态变化周期

git status : 查看哪些文件处于什么状态

新文件在之前的提交中没有存在,因此新文件处于未跟踪的状态;

git add <newfile>

执行 git add 命令开始跟踪一个文件,此时新文件处于暂存的状态;git add 命令还可以将已跟踪的文件放在暂存区,以及用于合并时把有冲突的文件标记为已解决状态;

git status -s/--short :查看文件状态的简览

$ git status -s
 M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

未跟踪状态的文件前面有??标记,"暂存"状态的文件前面有A标记,修改过的文件前面有M标记。输出中有两栏,左栏表示暂存区的状态,右栏表示工作区的状态。 例如,上面的状态报告显示:README 文件在工作区已修改但尚未暂存,而 lib/simplegit.rb 文件已修改且已暂存。 Rakefile 文件已修,暂存后又作了修改,因此该文件的修改中既有已暂存的部分,又有未暂存的部分。

配置忽略文件

.gitignore 文件中可以列出要忽略的文件的模式,这样这些文件就无需纳入 Git 的管理。

$ cat .gitignore
*.[oa] 
*~

第一行告诉 Git 忽略所有以 .o.a结尾的文件。第二行告诉 Git 忽略所有名字以波浪符结尾的文件。

查看已暂存和未暂存的修改

git diff :查看未暂存的文件改动
git diff --staged/--cached :查看已暂存文件与最后一次提交的文件差异

提交更新

git commit

git commit 命令会启动选择的文本编辑器来输入提交说明;启动的编辑器通过 git config --global core.editor命令设置。

git commit -v :编辑器会输出更详细的 diff 信息
git commit -m <commit message> : 将提交信息与命令放在同一行
git commit -a -m <commit message> : 将所有已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤,要小心的是,有时会把不需要的文件添加到提交中。

移除文件

git rm <file> : 从已跟踪文件清单中移除,并连带从工作目录中删除指定的文件
git rm -f <file> : 从之前修改过或已经放到暂存区的文件中删除
git rm --cached <file> : 把文件保留在磁盘,但不让 Git 继续跟踪。当你忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。

git rm 命令后面可以列出文件或者目录的名字,也可以使用glob模式

移动文件

git mv <file_from> <file_to> : 重命名文件

查看提交历史

git log : 按时间先后顺序列出所有的提交
git log -p/--patch -<n> : 显示每次提交所引入的差异,限制显示的日志条目数量,例如-2选项显示最近的两次提交
git log --stat : 显示每次提交的简略统计信息(例如所有白修改的文件以及被修改的文件的哪些行被移除或是添加了)
git log --pretty=oneline : 使用不同于默认格式的方式展示提交历史(例如子选项:oneline会将每个提交放在一行显示,方便浏览大量提交;另外还有shortfullfullerformatformat可以定制记录的显示格式)

git log --pretty=format:"%h - %an, %ar : %s";
format 常用的选项可参考附录

git log --pretty=format:"%h %s" --graph:添加 ASCII 字符串形象地展示你的分支、合并分支
git log --since=2.weeks : 显示最近两周的所有提交(--since--until 限制时间长度)

该命令可用的格式十分丰富——可以是类似 "2008-01-15" 的具体的某一天,也可以是类似 "2 years 1 day 3 minutes ago" 的相对日期

git log --author=<John> : 过滤显示指定作者为John的提交记录

过滤出匹配指定条件的提交。用 --author 选项显示指定作者的提交,用 --grep 选项搜索提交说明中的关键字。你可以指定多个 --author--grep 搜索条件,这样会只输出 任意 匹配 --author 模式和 --grep 模式的提交。然而,如果你添加了 --all-match 选项, 则只会输出 所有 匹配 --grep 模式的提交。

git log -S function_name : 显示那些添加或删除了该字符串的提交
git log -- <path> : 只输出某些文件或者目录的历史提交记录,需要在最后指定

$ git log --pretty="%h - %s" --author='Junio Hamano' --since="2008-10-01" --before="2008-11-01" --no-merges -- t/
//查看 Junio Hamano 在2008年10月期间,除了合并提交之外的哪一个提交修改了测试文件的提交记录 

git log 的常用选项可参考附录
限制 git log 输出的选项

撤销操作

git commit --amend :重新提交,可以修改提交信息,也可以添加漏掉的未添加的文件(需要提前执行git add <file> 操作),第二次提交会代替第一次提交的结果,最终只会有一个提交

修补提交最明显的价值是可以稍微改进你最后的提交,而不会让“啊,忘了添加一个文件”或者 “小修补,修正笔误”这种提交信息弄乱你的仓库历史

git reset HEAD <file> :取消暂存的文件,即将文件的"暂存"状态转换为"已修改未暂存"状态
git checkout -- <file> :撤销文件的修改,即将文件的"已修改"部分放弃,恢复为上次提交时的样子

记住,在 Git 中任何 已提交 的东西几乎总是可以恢复的。 甚至那些被删除的分支中的提交或使用 --amend 选项覆盖的提交也可以恢复 。 然而任何你未提交的东西丢失后很可能再也找不到了。因此除非你确定不想要对那个文件的本地修改,否则不要使用git checkout这个命令。

查看远程仓库

git remote : 列出你指定的每一个远程服务器的简写,例如 origin 是默认的克隆的仓库服务器的名字
git remote -v : 显示简写与对应的 URL
git remote show <remote> : 查看某一个远程仓库的更多信息
git remote rename <oldname> <newname> :修改一个远程仓库的简写名
git fetch <remote> :拉取远程仓库的最新信息

必须注意 git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
如果你的当前分支设置了跟踪远程分支, 那么可以用 git pull 命令来自动抓取后合并该远程分支到当前分支。 这或许是个更加简单舒服的工作流程。默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或其它名字的默认分支)。 运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。

git push <remote> <branch> :推送到远程仓库(推送之前需要先抓取别人在你上次拉取之后提交的工作,将其合并进自己的工作才能推送成功,否则会被拒绝)
git remote remove/rm : 移除一个远程仓库

一旦你使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。

打标签

git tag (-l/--list): 列出已有的标签(-l/--list是可选的)
git tag -l/--list "v1.8.5*" :只列出跟v1.8.5相关的标签

git brach -a : 查看所有分支
git fetch --prune :更新分支

git checkout -b local-branch origin-branch:创建对应于远程分支的本地分支,同时切换至本地分支

查看命令帮助手册

git help <verb>
git <verb> --help
man git-<verb>

如果不需要全面的手册,只需要可用选项的快速参考,可以使用 -h 选项获得更简明的 "help" 输出:

$ git add -h
usage: git add [<options>] [--] <pathspec>...

    -n, --dry-run         dry run
    -v, --verbose         be verbose

    -i, --interactive     interactive picking
    -p, --patch           select hunks interactively
    -e, --edit            edit current diff and apply
    -f, --force           allow adding otherwise ignored files
    -u, --update          update tracked files
    --renormalize         renormalize EOL of tracked files (implies -u)
    -N, --intent-to-add   record only the fact that the path will be added later
    -A, --all             add changes from all tracked and untracked files
    --ignore-removal      ignore paths removed in the working tree (same as --no-all)
    --refresh             don't add, only refresh the index
    --ignore-errors       just skip files which cannot be added because of errors
    --ignore-missing      check if - even missing - files are ignored in dry run
    --chmod (+|-)x        override the executable bit of the listed files
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,635评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,543评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,083评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,640评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,640评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,262评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,833评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,736评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,280评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,369评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,503评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,185评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,870评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,340评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,460评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,909评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,512评论 2 359