git 常用操作

本地操作


关于工作区和版本库
  • 工作区,就是我们在本机上Git目录,我们直接修改文件的时候,所有的修改都只是在工作区。
  • 暂存区(stage或者index),是版本库中的一部分。工作区中的修改需要通过git add添加到暂存区,这些修改在暂存区中等待被提交到版本库中形成版本。
  • 分支,是版本库中的重要部分。初始情况下Git为我们自动创建了第一个分支master,我们之后创建的分支,以及所有分支里的所有提交形成的版本记录都保存在这里。
  • HEAD指针,也是版本库中的重要部分。初始情况下它指向master,HEAD所指向的版本就是当前版本,也就是最新的提交。

用户名和邮箱地址的作用
用户名和邮箱地址是本地Git客户端的一个变量,不随git库而改变。
每次commit都会用用户名和邮箱纪录。
github的contributions统计就是按邮箱来统计的。

查看用户名和邮箱地址:

$ git config user.name
$ git config user.email

修改用户名和邮箱地址:

$ git config --global user.name "username"
$ git config --global user.email "email"

把当前目录变成Git可以管理的仓库

$ git init

查看仓库当前状态

$ git status

查看提交日志

$ git log  显示从最近到最远的提交日志
$ git log --graph 查看分支合并情况
$ git log --pretty=oneline 一行显示
$ git log --graph --pretty=oneline 一行显示分支合并情况
$ git log --graph --pretty=oneline --abbrev-commit  以简短的commit_id一行显示分支情况
abbreviation 缩写 缩写词
Git的commit id不是1,2,3…递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示.

查看不同difference

$ git diff     #是工作区(work dict)和暂存区(stage)的比较
$ git diff --cached    #是暂存区(stage)和分支(master)的比较
显示的格式正是Unix通用的diff格式

版本回退

工作区修改撤销
$ git checkout -- readme.txt
这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。

暂存区的撤销
针对已经 add到暂存区的情况
$ git reset HEAD readme.txt
把暂存区的修改回退到工作区,然后在执行工作区修改撤销

针对已经 add 和commit到分支上的情况
$ git reset --hard HEAD^
在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,
当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

也可以根据commit_id  跳到指定的版本
$ git reflog 查看命令历史  找到commit_id 
$ git reset --hard commit_id  前往指定版本

提交文件到本地分支

#把文件添加到添加到暂存区stage
$ git add readme.txt
#把暂存区的所有内容提交到当前分支 
$ git commit -m "wrote a readme file"
-m 后面输入提交说明 
每次修改,如果不add到暂存区,那就不会加入到commit中
git commit只负责把暂存区的修改提交

文件删除

$ rm test.txt   #删除工作区test.txt文件
如果误删 可以通过
$ git checkout -- test.txt  找回被删文件
删除仓库里的文件 
$ git rm test.txt
如果误删 可回退版本 回退后本地仓库回到原来状态

文件储藏

测试文件 提交到本地仓库时 然后在git rm 仓库里还有没有这个文件

问题:
commit 后没有版本号
解:没有执行过add的原因

远程操作


or create a new repository on the command line
用命令行创建一个新仓库
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/julysiji/learnGit.git
git push -u origin master

or push an existing repository from the command line
用命令行推到现有的仓库
git remote add origin https://github.com/julysiji/learnGit.git
git push -u origin master

问题:
每次push 都需要重新输入账号密码才可以
解决:

删除之前的ssh 秘钥重新生成
删除之前填在github里面的ssh key
把新生成的ssh key 填入github
执行
$ git remote rm origin
$ git remote add origin git@github.com:用户名/库名.git
在执行
推送master分支到 名称是origin的远程仓库
$ git push -u origin master
时会跳出警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
SSH连接在第一次验证GitHub服务器的Key时需要确认GitHub的Key的指纹信息是否真的来自GitHub的服务器
输入yes回车

接着会再弹一个警告
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
Git输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了

OK解决

远程克隆

github 支持两种格式
ssh协议下
$ git clone git@github.com:julysiji/gitSkills.git
https协议下
https://github.com/michaelliao/gitskills.git

master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点

分支的创建合并和删除

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

也可以分为两步进行操作
$ git branch dev            创建分支dev
$ git checkout dev         切换到分支dev
切换到master 切换分支时需要把当前分支的改动 add后commit
$ git merge dev   合并dev 分支到master分支

合并分支时,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息.
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit
这样从分支历史上就可以看出分支信息.
准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward 
$ git merge --no-ff -m "merge with no-ff" dev

合并分支时 冲突的时候需要 修改后 进行add commit 然后在合并 
$ git branch -d dev  删除dev分支
如果不想修改后再删除 也可以 直接强行删除
$ git branch -D dev
$ git merge --no-ff -m "merge with no-ff" dev
准备合并dev分支,请注意--no-ff参数,表示禁用Fast forward:

bug分支 工作区备份

当正在支线上进行的工作还没法提交 但是 必须在两个小时内修复一个bug 怎么办?
Git还提供了一个stash功能 可以把当前工作现场“储藏”起来 等以后恢复现场后继续工作
$ git stash
确定要在哪个分支上修复bug 假定需要在master分支上修复 就从master创建临时分支并修复bug
$ git stash list
显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
恢复指定的stash
$ git stash apply stash@{0}
恢复有两个办法:
一是用git stash apply恢复 但是恢复后 stash内容并不删除
你需要用git stash drop来删除 
另一种方式是用git stash pop 恢复的同时把stash内容也删了

多人协作

查看远程信息
$ git remote
查看远程详细信息
$ git remote -v
推送分支
$ git push origin master  推送master主分支到远程仓库origin
$ git push origin dev       推送dev分支到远程仓库origin

假设另外一个协同操作者从远程仓库clone
默认情况下只能看到master分支

$ git clone git@github.com:julysiji/gitSkills.git
如果需要在分支dev操作 需要创建远程分支到本地
$ git checkout -b dev origin/dev

当协同者push过分支后  本地自己push分支的时候会被拒绝提交提示有冲突
解决办法也很简单 Git已经提示我们 先用git pull把最新的提交从origin/dev抓下来 
然后在本地合并 解决冲突 再推送 当我们执行
$ git pull
时也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接
根据提示 继续执行
$ git branch --set-upstream-to=origin/dev

多人协作常用模式
1.首先 可以试图用git push origin branch-name推送自己的修改
2.如果推送失败 则因为远程分支比你的本地更新 需要先用git pull试图合并
3.如果合并有冲突 则解决冲突 并在本地提交
4.没有冲突或者解决掉冲突后 再用git push origin branch-name推送就能成功
如果git pull提示“no tracking information”则说明本地分支和远程分支的链接关系没有创建 用命令git branch --set-upstream-to=origin/branch-name。

标签创建:

首先切换到需要打标签的分支上git tag <name>就可以打一个新标签
$ git tag v1.0
根据commit_id 打标签
$ git reflog  查看commit_id
$ git tag v0.9 6224937
$ git tag 查看tag 标签
$ git show v0.9 查看标签信息 
创建带有说明的标签,用-a指定标签名,-m指定说明文字
$ git tag -a v0.1 -m "version 0.1 released" 3628164
还可以通过-s用私钥签名一个标签:
$ git tag -s v0.2 -m "signed version 0.2 released" fec145a

tag的删除 标签都只存储在本地 不会自动推送到远程 所以打错的标签可以在本地安全删除
$ git tag -d V1.0
推送某个标签到远程,使用命令
$ git push origin V1.0
一次性推送全部尚未推送到远程的本地标签
$ git push origin --tags
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除 
$ git tag -d V1.0
然后,从远程删除。删除命令也是push
$ git push origin :refs/tags/V1.0
git log 查看commit的历史
git show <commit-hash-id>查看某次commit的修改内容
git log -p <filename>查看某个文件的修改历史
git log -p -2查看最近2次的更新内容

http://www.jianshu.com/p/ed1f4bdbfb51
http://www.jianshu.com/p/40441281adc3
https://yq.aliyun.com/articles/3103

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

推荐阅读更多精彩内容

  • git常用操作 第一次连接远程仓库的配置 配置user.name 和user.email git config -...
    爱撒谎的男孩阅读 432评论 0 0
  • 第一次连接远程仓库的配置 1)配置user.name 和user.email git config --globa...
    四月不见阅读 268评论 0 0
  • 做小孩子的时候 是不喜欢下雨的 因为雨天要出去玩是不会被允许的 于是雨天成了最无聊的天气 那时雨天的乐趣是打着伞穿...
    之极之急su阅读 214评论 1 3
  • ##HTML5简介###新特性:> 1. 新布局素,header、nav、section、article、foot...
    陌路车客阅读 199评论 0 1
  • 从9月7日开始就要进入白露时节了,我们来聊聊白露养生 进入了白露时节,那就是真正凉爽季节的开始,在调养身体时,不要...
    米豆厥词阅读 765评论 0 0