Git学习

学习参考:https://www.liaoxuefeng.com/wiki/896043488029600

Git是分布式版本控制系统。
未跟踪-->工作区 --> 暂存区 --> 本地仓库 --> 远端服务器

git仓库交互示意图
经典分支模型

1、本地操作

(1)基本操作

1、git init
本地目录中将文件夹初始化为git仓库

2、git add .
将工作区的所有文件添加到暂存区
git add file.cpp
将工作区的指定文件添加到暂存区

3、git commit -m "添加注释"
将暂存区中的文件Commit到本地仓库,实际上就是把暂存区的所有内容提交到当前分支。
假如file.txt先新增一行a,然后add,再新增一行b,然后commit,则commit只将a提交到本地仓库
git commit --amend "新的注释" 修改最后一次提交的注释信息

4、git remote add origin 直接复制url.git
将本地仓库链接到远终端,ssh方式直接复制url,不需要加.git


(2)查看相关

5、 git status
查看仓库状态
将工作区文件、暂存区文件同本地仓库进行对比

6、查看修改
1、 git diff file.txt
将工作区文件(add之前)同本地仓库(commit之后)进行对比,输出不同的地方。
2、git diff file.txt --cached
将暂存区文件(add之后commit之前)同本地仓库(commit之后)进行对比,输出不同的地方。

7、查看本地仓库不同版本的commit记录 git log

三次提交的记录1

简洁版 git log --pretty=oneline
三次提交记录2

log中黄色的是commit id(版本号),HEAD表示当前版本,上一个版本就是HEAD^, 上上一个版本就是HEAD^^, 当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。

查看分支合并图 git log --graph


(3)撤销相关

8、add之前
撤销工作区的修改 git checkout -- file.txt
修改了file.txt,但还没add,通过该命令行可撤销。add后不可撤销。

9、add后,commit前
撤销暂存区的修改 git reset HEAD file.txt
结果是把file.txt的操作撤回到工作区add之前,里面修改的内容仍然在,若想进一步撤回参考第8条

10、commit之后
版本回退(撤销本地仓库区的修改)
一般用于将目标commit之后的所有commit丢弃,如果回到过去后想回到未来,需要知道未来版本的版本号。
git reset --hard 1094a 去到1094a开头的版本节点
git revert 1094a 将1094a开头的版本节点复制出一个新的commit节点跟在当前HEAD的后面
git reflog命令查看每一次commit命令,找到目标commit的版本号。然后通过上述两个命令去到任何commit过的节点。

git reflog


(4)删除文件

11、工作区删除 rm file.txt

12、确认要删除
git rm file.txt
git commit -m "remove file.txt"

13、11条后12条前,后悔删除,需要复原 git checkout -- file.txt
前提是file.txt之前commit过,复原成之前commit的样子


(5)stash

14、暂存工作区里的内容(add之前) git stash
多次stash是以压栈的形式保存,在stash list中,stash@{0}是最近一次压栈的。
不同的分支共用一个stash,可以在feat1中stash存储,然后去feat2中把feat1的stash调出来。

15、查看stash中保存的内容 git stash list

stash list

16、恢复stash中的内容
[1] git stash pop 弹出stash栈顶恢复工作区,并删除stash栈顶
[2] git stash apply 弹出stash栈顶恢复工作区,不删除stash栈顶
git stash drop 删除stash栈顶
[3] git stash apply stash@{1} 恢复指定的stash

2、本地和远端交互

1、将远端代码克隆到本地
(1) git clone https://github.com/GitHub用户名/要关联的仓库名.git
HTTP方式。添加后,对于本地来说,远程库的名字默认是origin
(2)
SSH方式。

2、解除远程链接 git remote rm origin

3、合并 git pull --rebase origin master
git pull = git featch + git merge
git pull --rebase = git featch + git merge --rebase
区别参考下面的合并分支小节。

4、push
推代码到远端仓库origin的master分支 git push -u origin master
第一次上传-u,之后不再需要,可直接git push origin mastergit push
强制上传 git push origin master -f
git push origin dev1:dev2:将本地的dev1分支的代码推代码到远端的origin仓库的dev2分支,如果远端不存在dev2则在远端新建一个,然后如有需要在远端申请将dev2合入master

5、查看远程库的信息
git remote
git remote -v

3、分支

1、创建分支
(1)git checkout -b dev
创建并切换到dev分支
创建分支的时候处于分支feat下,新分支就是feat的复制版。如在master下创建的分支feat1和在dev下创建的feat2里的内容是不同的。
切换分支 git checkout dev
(2)git branch feat01
基于当前分支创建分支feat01,但不切换到feat01

2、查看本地分支和当前分支 git branch
-a 查看所有分支(包括本地和远程)
-r 仅查看远程分支

3、合并分支
目的:将feat02分支的commit合并到feat01分支
(1)merge方式
git merge feat02
切回feat01分支,执行该命令,合并结束后的当前分支为feat01。
会产生新的commit节点来完成合并,新的commit节点会保存被合并的两个分支的所有commit记录。

merge

(2)rebase方式:推荐使用
git rebase feat01
切换到feat02分支,执行该命令,git将feat02分支的commit续在feat01后面。合并结束后的当前分支为feat02。
git checkout feat01
切换回feat01
git merge feat02
在feat01上执行该命令。得到线性的合并结果。

①rebase

③merge

4、删除dev分支 git branch -d dev
删除一个有commit但没有被合并过的分支dev git branch -D dev

5、删除远端test分支 git push origin --delete test

4、问题和场景

1、github上传后文件夹是灰色的,无法打开
(1)删除内层文件夹里的.git
(2)如果还是不行,是因为有缓存,重命名,再add-commit-push

2、当前在dev分支工作中,master上出了bug
(1)储藏dev分支的工作 git stash
(2)切换到master分支,建立一个bug1分支,解决bug后合并master和bug1,删除bug1分支
(3)回到dev分支,git stash pop,恢复现场并删除stash内容。git stash list可以查看存储状态。

3、修改复制
在master分支上修改历史bug,commit后得到commit ID设为123456。然后由master拉出的其他分支都会有这个bug,避免重复劳动,需要把bug的提交123456复制到其他分支(如dev)上。
git cherry-pick <commit id 如 123456>

4、多人协作
[1] 首先,可以试图用git push origin <branch-name>推送自己的修改。
如果推送失败,则是因为远程分支比本地的更加新,需要先用git pull试图合并;
[2] 如果合并有冲突,则解决冲突,并在本地提交;
冲突为:

<<<<<<  HEAD
111111
===========
2222222
>>>>>> otherFeat

[3] 没有冲突则用git push origin <branch-name>推送就能成功。
有冲突解决掉后,重新add-commit-push推送。这里的commit可以不用-m。
[4] 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

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

推荐阅读更多精彩内容

  • Git教程 一、Git简介 1.1. Git的诞生1.2.集中式的vs分布式 二、安装Git 三、创建版本库 四、...
    曹渊说创业阅读 929评论 0 2
  • (参照莫烦教程morvanzhou.github.io/tutorials/others/git/) 1.wind...
    忆江南_1569阅读 238评论 0 1
  • 安装: windows安装git-- msysgit是windows版的git,下载单独的.exe按照默认选项安装...
    alceyp阅读 678评论 0 0
  • 不知不觉中儿子就两岁了,也许是新生命到来后那纯粹的一切让人忘了累,那份责任让你没有计较的余地,突然觉得时间...
    一粒尘埃_7774阅读 437评论 0 1
  • 李军是我初中同学,十三岁就在一起读书。他人特老实、善良。 学校就在他家所在的镇上。我与另一位同学也经常到他家去吃饭...
    i磨刀石阅读 320评论 2 1