【Git】使用总结

特有名词解释

DETACHED HEAD

HEAD normally refers to a named branch (e.g. master). Meanwhile, each branch refers to a specific commit.

HEAD 通常指的是一个已被命名的分支(如master).但同时每一个分支可以指向一个具体的提交。DETACHED HEAD 意味着HEAD游标指向一个具体的commit而非某个被命名的分支。(it means simply that HEAD refers to a specific commit, as opposed to referring to a named branch. )

在这种状态下,一般会出现这个问题:Your branch and 'origin/master' have diverged 需要如下新建分支合并分支的方法解决:

git branch my-temporary-work
git checkout master
git merge my-temporary-work

为什么要设立一个暂存区的概念

工作区、版本库、暂存区原理图

便于小步提交。比如你本地改到一半,有个紧急的 bug 需要修复。你不想将改到一半的东西 commit 进去。所以先 stash 一下,改掉 bug 并 commit,然后 stash pop 出来继续没完成的工作。
小步提交对于维护大型项目很有意义,方便跟踪每一步发生了什么追踪问题。

代码比对

git diff

仅仅是比较 unstaged 的代码和 staged 的代码的区别。untracked 的代码必须先 track.

提交文件

git commit

-a 参数只对修改或删除的文件会自动加到暂存区,对新增文件(untracked)文件无效
-v (--verbose)推荐使用 -v 代替 -m 因为这样可以更好地书写多行 commit message
--amend 修改上一次的 commit message。注意如果是上一次修改已经提交,可能会出现 Your branch and 'origin/master' have diverged 的问题。

删除未监视文件 (untracked files)

建议加上 -n 参数(表示 dry-run)不直接删这些文件而是来先看看会删掉哪些,防止重要文件被误删。
git clean -nf 删除 untracked files
git clean -nfd 连 untracked 的目录也一起删掉

用于保存和恢复工作进度

git stash

意义: Stash(隐藏) the changes in a dirty working directory away
stash是临时保存文件修改内容的区域。stash可以暂时保存工作树和索引里还没提交的修改内容,您可以事后再取出暂存的修改。
注意:stash 的信息为各个分支公用,以栈数据结构存储信息。
git stash save "message..." 保存工作进度 (简写版:git stash)
git stash list 显示进度列表
git stash pop (stash@{0}) 参数表示第几个存储的状态
git stash drop 删除最后一个存储状态,在遇到 stash merge 冲突时经常使用(一般先解决合并冲突,然后 git stash drop )
git stash clear 清空
操作流程:保存工作进度→完善紧急的修改→stash pop继续之前没完成的工作
[stash 储藏](https://git-scm.com/book/zh/v1/Git-%E5%B7%A5%E5%85%B7-%E5%82%A8%E8%97%8F%EF%BC%88Stashing%EF%BC%89

回退回滚

git reset——针对本地仓库的文件的撤销

git reset 是变更某分支 HEAD 游标位置的命令。
git reset <文件所在路径>将 staged 状态的文件变为 unstaged 状态。
git reset --hard HEAD~2 将 HEAD 游标回退两个版本。
git reset --hard <commitID>:将当前分支重置为指定版本。(提交版本号commitID通过git log查看)。应用场景:当你解决完冲突,并且在合并完成后发现一个错误,你仍然还是有机会来简单地撤销它。你只须要键入 “git reset --hard ” 命令

git reset常见的三种模式:soft、mixed、hard(不同的影响范围)

git revert——针对远程仓库 commit 的撤销

git revert 用于撤销已存在的 commit ,并且会创建一个新的提交,是一种安全的做法。

reset VS revert

reset 是在正常的 commit 历史中,删除了指定的 commit ,这时 HEAD 是向后移动了。而 git revert 不会改变现在的提交历史,它是在正常的 commit 历史中再 commit 一次,他的 HEAD 是一直向前的。
因此,git revert 可以用在公共分支上,git reset 应该用在私有分支上。你也可以把 git revert 当作撤销已经提交的更改,而 git reset HEAD 用来撤销没有提交的更改。

分支管理

git branch

  • git branch 查看当前 checkout 过哪些远程分支,并且会标明当前所在分支。
  • git branch -v 除以上功能外还会显示分支的最后提交记录。
  • git branch --remote 查看远程库有那些分支
  • git branch <分支名> 创建某分支。和git checkout -b区别在于不切换到该分支。
  • git branch -d <分支名> 删除某分支(必须保证目前不处于该分支)(注意这一步仅仅是删除本地分支,远程分支删除还得用 git push)
  • git branch -m <old-branch> <new-branch> 重命名分支(变更分支名)

git checkout

  • git checkout -f 目标文件(夹)所在目录 强行覆盖本地的文件(夹)
    ①若修改后仍未放到缓存区,则恢复到上一次git commit的状态。
    ②若添加到缓存区后又做了修改,恢复到上一次git add的状态。
  • git checkout -b <分支名> 创建并切换到该分支,等价于git branch <分支名> + git checkout <分支名>。

tag管理

git push origin --tags把本地版本推送到了远程代码仓库
如果刚刚同步上去,你缺发现一个致命bug ,需要重新打版本
git tag -d <某个具体版本号,如V1.2>
这一步只是删除了本地 V1.2的版本,可是线上V1.2的版本还是存在
这时我们可以推送的空的同名版本到线下,达到删除线上版本的目标:
git push origin :refs/tags/V1.2

配置设置

git config

git对大小写敏感
git 默认对文件名大小写不敏感 (不区分文件名大小写)
git config core.ignorecase false

为指定命令配置一个别名,可快速输入命令。
git config --global alias.命令别名 命令
例如
git config --global alias.st status
:使用git st代替git status

查看公钥

cat ~/.ssh/id_rsa.pub,注意查看是否有空格之类的,否则公钥不正确。

远程仓库操作

如何将一个已存在的目录转换为一个 GIT 项目并托管到 GITHUB 仓库?
http://leonshi.com/2016/02/01/add-existing-project-to-github/

git remote

查看全部远程仓库详细地址:
git remote -v
查看当前远程仓库地址:git remote -v(这个在不确定当前是fork的代码还是人家的代码时很有效)

对远程仓库进行操作:
git remote add <远程仓库名> <远程仓库地址> 多人协作开发,需要相互添加远程仓库。(这个具体怎么运作去实际单位实践一下应该就知道了)
git remote rm <远程仓库名>当某个开发者不再贡献代码的时候就可以删除他对应的远程仓库了。

删除远程仓库的分支:git push origin --delete develop1(删除远程仓库origin的develop1分支,等价于git push origin :develop1

git pull

git pull = git fetch + merge to local(有时候git pull会出现落后于远程仓库的问题,所以先fetch)

提交日志

git log

按照时间顺序显示所在分支的提交日志git log -g(这是为了避免代码回滚带来的影响。不加-g的提交日志和远程仓库的commit信息是保持一致的。但是如果有代码回滚操作,回滚位置之前的commit logs信息就看不到了)
查看提交日志git log --pretty=oneline(整洁版本)

解决冲突

git merge

git merge master feature 将master分支合并到feature分支 等价于

git checkout feature  //切换到feature分支
git merge master // 将master分支合并进feature分支

git merge --abort仅仅在合并后导致冲突时才使用。将会抛弃合并过程并且尝试重建合并前的状态。

其他

利用gitmoji-cli 来提交带有 emoji 的commit
gitmoji -i Initialize gitmoji as a commit hook,这样每次 commit 会自动打开
gitmoji 提示
gitmoji -r Remove a previously initialized commit hook
gitmoji -c 交互式提交

git pgp签署工作

必须首先安装gpg(GnuPG)(一般用 HomeBrew )
gpg --gen-key 先生成自己的密钥
生成密钥的时候还遇到问题,后来依靠其中的 Thumb 解决。

pgp 签署工作
参考:http://www.ruanyifeng.com/blog/2013/07/gpg.html

疑惑

git pull --rebase做了什么?我的detached HEAD状态解除了

参考文献

Git远程操作详解(有幅图片很棒)
https://github.com/geeeeeeeeek/git-recipes/wiki/
http://www.worldhello.net/gotgit/index.html
bitbucket git教程

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