git 命令行的使用

Git 的优势

  1. 离线工作:每个人的电脑都是一个完整的版本库,即使不连接服务器,也可以在本地进行版本管理;
  2. 强大的分支管理;

创建仓库

clone 一个已存在的仓库

git clone ssh://user@domain.com/repo.git

创建一个新的本地仓库

git init

git 本地工作流程.jpg

本地仓库和远程仓库:

本地仓库以一个隐藏的文件夹(.git)的形式存储在项目的根目录下;
远程仓库没有工作目录,完全由 .git 仓库目录组成。开发团队使用远程仓库进行数据共享和交换。

本地修改

查看工作副本的状态:git status

查看与上次版本文件的不同:git diff

添加所有修改到暂存区,等待下次提交:git add .

提交暂存区的文件到本地仓库:git commit -m "commit comment"

修改上次的提交(请勿修改已经推送到远程的提交记录):git commit --amend

或者,直接带上要修改的注释:git commit --amend -m "This is the correct message"

也可以添加更多的改动到上次的提交中:

  1. git add file.txt
  2. git commit --amend -m "commit message"

查看日志

查看所有的提交记录:git log

指定显示 log 的数目:git log -<num>

查看提交时文件的变化:git log -p

显示指定文件的所有修改:git log -p <file>

谁,在什么时间,修改了文件的什么内容:git blame <file>

只看某人的提交:git log --author=<name>

每条日志单行显示:git log --pretty=oneline

查看每一次操作,包括回退:git reflog

查看分支合并图:git log --graph --pretty=oneline --abbrev-commit

查看远程仓库的日志:git log origin/master

分支操作

创建、合并和删除分支非常快,所以 Git 鼓励使用分支完成某个任务,合并后再删掉分支,这和直接在 master 分支上工作效果是一样的,但过程更安全。

创建新分支(基于当前分支):git branch <new-branch>

创建新的可追溯的分支(基于远程分支):git checkout --track <remote/branch-name>

创建并切换分支:git checkout -b dev

切换分支:git checkout <branch>

查看分支:git branch

查看所有分支(包括远程),并显示最后一次的提交记录:git branch -av

合并分支:git merge <branch>

删除分支:git branch -d <branch>

删除一个没有被合并的分支:git branch -D dev

删除远程仓库的分支:git branch -dr <remote/branch>

下载远程的 dev 分支 :git checkout -b dev origin/dev

设置本地分支 dev 和远程分支 origin/dev 的关联:git branch --set-upstream-to=origin/dev dev

标签操作

Git 标签其实是一个指向某个 commit 的指针,所以创建和删除标签都是瞬间完成的。

给当前的提交打标签:git tag <tag-name>

指定给某次的提交打标签:git tag <tag-name> <commit-id>

-a 指定标签名,用 -m 指定说明文字 :git tag -a <tag-name> -m <message> <commit-id>

查看标签:git tag

查看某个标签的信息 :git show <tagname>

推送某个标签:git push origin v1.0

推送所有标签:git push --tags

删除本地标签:git tag -d <tag-name>

删除远程标签:

  1. 先删除本地标签;
  2. 然后推送:git push origin :refs/tags/<tag-name>

远程仓库

添加远程仓库(一般把 remote 命令为 origin,可以添加多个远程仓库):git remote add <remote> <url>

列出当前配置的远程仓库:git remote -v

查看远程仓库的信息:git remote show <remote>

删除远程仓库:git remote rm <remote>

修改远程仓库的地址:git remote set-url <remote> <url>

更新/下载

下载远程仓库的所有改动到本地,不会自动合并到当前:git fetch <remote>

下载远程仓库的所有改动到本地,自动合并到当前:git pull <remote> <branch>

将本地版本发布到远程仓库:git push <remote> <branch>

第一次推送 master 分支到 origin:git push -u origin master,添加 -u,会把本地的 master 分支和远程的 master 分支关联起来,以后推送可以直接使用 git push

比较操作

查看当前工作副本中所有未提交的变化:git diff

指定要查看的文件:git diff <filename>

与版本库的任意版本比较文件:git diff <commitID> -- <file>

比较任意两个版本之间的内容:git diff <commitID> <commitID>

比较两个分支之间的内容:git diff master dev

保存/恢复工作区

不要提交还未完成的工作。

临时需要修改一个bug,当前的任务又没有完成,不能提交。执行 git stash,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作。

改完 bug 之后,要恢复工作区,继续之前的工作:

查看 stash:git stash list

恢复:git stash apply,恢复之后,stash 内容没有删除,用 git stash drop 来删除;

恢复并删除:git stash pop

可以执行多次 git stash 保存工作区,恢复的时候,指定 stash id:git stash apply stash@{0}

储藏功能可以帮助我们得到一个干净的工作副本。当然,它还可以应用在很多不同的流程中,强烈推荐在下列情况中储藏你的本地改动:

  • 在切换到不同分支之前。
  • 在获取(pulling)远程改动之前。
  • 在合并(merging)或者衍合(rebasing)一个分支之前。

撤销

在 Git 中,用 HEAD 表示当前版本,上一个版本就是 HEAD^,上上一个版本就是HEAD^^,往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

放弃工作副本中的所有修改(回退到当前版本):git reset --hard HEAD

回退到指定版本,放弃之后的修改(查看 git log,已经回退到之前的提交)

git reset --hard <commit-id>

(不使用 --hard 会保留之前的修改,放在工作副本中)

回退之后又想回去了:

先使用 git reflog 查看所有的操作,找到 commitID 再进行回退。

使用 revert 进行回退(查看 git log,创建了一个新的提交):git revert <comit-id>

修改了文件,还没有执行 add,此时文件在工作区,回退到之前的版本:git checkout -- <file>

修改了文件,执行了 add ,此时文件在暂存区,回退:git reset HEAD <file>

配置

使用.giignore 文件,忽略不想要管理的文件。这里有模版 https://github.com/github/gitignore

文件别忽略了,也可以强制添加:git add -f target/

检查 .gitignore 是否有问题:git check-ignore -v .gitignore

配置别名:git config --global alias.st status

然后就可以使用 git st 代替 git status 了。

当前仓库的配置文件在 .git/config 文件中,全局的 git 配置文件在用户目录下的 .gitconfig

使用 git

  1. 一次提交仅仅对应一个相关的改动,不要把那些互相毫无关联的改动打包在同一次提交中。
  2. 不要提交不完整的改动,保存当前的工作用 git stash
  3. 每次提交都要详细的注释,说清楚:为什么要改?改了什么?。
  4. 养成频繁提交的习惯,避免很庞大的提交,这样也容易避免冲突的发生。
  5. 使用强大的分支,比如:开发新功能,修改 bug 等。
  6. 遵循一致的工作流程,比如:长期分支,特性分支,merge 还是 rebase 等。
  7. 使用帮助文档:git help <command>

参考网站

  1. Git 官网
  2. 廖雪峰 git 教程
  3. Learn Version Control with Git
  4. git pro 中文版

可视化工具

SourceTree,跨平台,免费。
Tower,Mac 上非常出名的 git 工具,目前已经有 windows 版本,收费。

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

推荐阅读更多精彩内容

  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,866评论 5 147
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,911评论 0 11
  • 1.git的安装 1.1 在Windows上安装Git msysgit是Windows版的Git,从https:/...
    落魂灬阅读 12,658评论 4 54
  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,465评论 1 26
  • 成长是一首诗 写出来也罢,唱出来也罢 总要有适合的语词去堆砌 填充诗歌的颜色 赤橙黄绿青蓝紫 总有一种颜色属于自己...
    石默_语阅读 836评论 0 7