git命令大全

[TOC]

基本概念

  • master指针:指向最新的提交

资料

http://sfault-image.b0.upaiyun.com/37/92/37923f2478edc5709b36562b26c9e008


全局配置

$ git config --global user.name "kk"
$ git config --global user.email "xxx@gmail.com"

  • 编辑模式查看全局设置:
    git config --global -e

  • 列表形式查看全局设置:
    git config --global -l


使用GitHub时,在本地创建SSH Key

ssh-keygen -t rsa -C "youremail@example.com"

  • 如果一切顺利的话,可以在用户主目录里(~/.ssh)找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

  • 第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
    然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容


远程仓库

  • 克隆远程仓库到本地
    git clone git@github.com:michaelliao/gitskills.git

  • 克隆远程仓库某个分支到本地
    git clone -b <branch> <remote_repo>
    例如: git clone -b 指定的分支名字

  • 给本地仓库指定远程仓库

  1. 关联GitHub仓库:
    git remote add origin git@github.com:michaelliao/learngit.git

  2. 显示远程仓库:
    git remote show origin
    第一次推送使用:
    git push -u origin 分支名称
    之后推送使用:
    git push origin maste

  3. 查看远程仓库地址
    git remote -v

  4. 取消关联远程仓库
    git remote rm origin


初始化git仓库

git init
git add .
git commit -m “xxxx"


文件操作

删除所有文件
git rm * -r
删除文件夹
git rm filename -r
忽略无需版本控制的文档
echo “*.txt” > .gitignore


日志

查看commit日志
git reflog

git log


分支管理

  • 查看当前所在分支
    git branch -a
  • 切换到某个分支
    git checkout 分支名字

  • 创建本地分支并切换到创建的分支:
    git checkout -b your_branch
  • 提交该分支到远程仓库
    git push origin dev

  • 追踪远程分支
    git branch --track release_2.3.0 origin/HEAD:refs/for/release_2.3.0
  • 将本地分支push到远程分支,(远程会自动创建your_branch分支),并关联本地分支与远程分支
    git push -u origin your_branch
  • 删除远程分支
    git push origin --delete <branchName>
  • 删除本地分支
    git branch -d your_branch

本地提交回滚

  1. 先重置本地在上次提交之后的修改(如果需要的话)
    git checkout *.m
  2. 重置为远程仓库的最新版本
    soft表示本地的修改还在本地文件中,不加的话那么本地的修改也没了
    git reset HEAD^ --soft

拉取远程代码时冲突

  1. 保存本地修改到暂存区
    git stash
  2. 拉取远程代码
    git pull
  3. 将暂存区内容恢复到本地,有冲突时先解决冲突
    git stash pop

git stash 的使用

  • 列出所有暂时保存的工作
    git stash list
  • 恢复某个暂时保存的工作

git stash apply stash@{1}

  • 保存stash时设置stash名称
    git stash save "my_stash"

  • 丢弃最近一次stash的文件
    git stash drop

合并某次提交 merge a specific commit in Git

git cherry-pick d42c389f


git merge 后 push 到 Gerrit 失败,提示 no new changes

  • git merge 的时候,加上 --no-ff 参数,是为了让它生成一个新的 commit,这样就可以提交了~(不过生成的 gerrit change 是看不到改动信息的)

tag 操作

  • 查看tag
    git tag
  • 创建 本地 tag
    git tag 1.0.0
    或者
    git tag -m "first release" 0.1.0
  • 推送 本地 tag 到远程服务器
    git push origin 1.0.0
  • 或者推送所有tags到远程服务器
    git push --tags
  • 删除本地 tag
    git tag -d 1.0.0
  • 删除远程 tag
  1. 先删除本地 tag
    git tag -d 1.0.0
  2. 然后push
    git push origin --delete tag 1.0.0

fatal: remote origin already exists.错误解决

  1. 先删除远程 Git 仓库

git remote rm origin
2 再添加远程 Git 仓库

git remote add origin git@github.com:FBing/Java-code-generator

git ignore

  • 创建.gitignore文件
    touch .gitignore
    忽略规则示例
# 这是注释行,将被忽略
*.a       # 忽略所有以.a为扩展名的文件    
!lib.a    # 但是名为lib.a的文件或目录不要忽略,即使前面设置了对*.a的忽略
/TODO     # 只忽略此目录下的TODO文件,子目录中的TODO文件不忽略
build/    # 忽略所有build目录下的文件,但如果是名为build的文件则不忽略
doc/*.txt # 忽略文件如doc/notes.txt,但是文件如doc/server/arch.txt不忽略

例如忽略下图的GPUImage.framework框架

SystemVedio/GPUImage/GPUImage.framework
6218590.png

只追踪某几个文件

#忽略所有文件,注意放在开头
/*
#除src文件夹外
!/src
#除bin文件夹外
!/bin 
#总的效果就是git只跟踪src和bin两个文件夹

merge 与 rebase 的区别

参考:https://www.zhihu.com/question/36509119/answer/131513261

搞清楚这个问题首先要搞清楚merge和rebase背后的含义。

merge:会产生一次合并提交

先看merge,官方文档给的说明是:
git-merge - Join two or more development histories together

顾名思义,当你想要两个分支交汇的时候应该使用merge。
根据官方文档给的例子,是master merge topic,如图:
A---B---C topic
/
D---E---F---G---H master
然而在实践中,在H这个commit上的merge经常会出现merge conflict。为了避免解决冲突的时候引入一些不必要的问题,工程中一般都会规定no conflict merge。比如你在github上发pull request,如果有conflict就会禁止merge。

所以才会有题主问的问题:在当前的topic分支,想要引入master分支的F、G commit上的内容以避免merge conflict,方便最终合并到master。

这种情况下用merge当然是一个选项。用merge代表了topic分支与master分支交汇,并解决了所有合并冲突。然而merge的缺点是引入了一次不必要的history join。如图:
A--B--C-X topic
/ /
D---E---F---G---H master
其实仔细想一下就会发现,在引入master分支的F、G commit这个问题上,我们并没有要求两个分支必须进行交汇(join),我们只是想避免最终的merge conflict而已。

rebase:将其他分支的内容整合到当前分支,改变当前分支branch out的位置

rebase是另一个选项。rebase的含义是改变当前分支branch out的位置。这个时候进行rebase其实意味着,将topic分支branch out的位置从E改为G,如图:
A---B---C topic
/
D---E---F---G master
在这个过程中会解决引入F、G导致的冲突,同时没有多余的history join。但是rebase的缺点是,改变了当前分支branch out的节点。如果这个信息对你很重要的话,那么rebase应该不是你想要的。rebase过程中也会有多次解决同一个地方的冲突的问题,不过可以用squash之类的选项解决。个人并不认为这个是rebase的主要问题。

综上,其实选用merge还是rebase取决于你到底是以什么意图来避免merge conflict。实践上个人还是偏爱rebase。一个是因为branch out节点不能改变的情况实在太少。另外就是频繁从master merge导致的冗余的history join会提高所有人的认知成本。

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

推荐阅读更多精彩内容

  • git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git b...
    猿万阅读 4,968评论 1 45
  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,384评论 1 26
  • 1,查看所有远程分支:%git branch -r 2, 拉取远程分支并创建本地分支git checkout -...
    will666阅读 2,004评论 0 18
  • 初中时期的我,很不懂事,甚至厌倦父母对我的管教。我开始和他们争吵,争吵过后我非但没有愧疚反而有一丝爽快。这是我之...
    浅沫or阅读 182评论 0 2
  • 最后一个巫师猎人 长得像反派的最后果然还是反派 活得长就是比什么都好 其实看到什么 无论看到什么 想到的还是一样的
    秩序守护者阅读 107评论 0 0