Git指令

1. 创建版本库并提交文件

1.创建一个版本库
git init :把这个目录变成Git可以管理的仓库
ls -ah:可以看到隐藏的.git目录
2.将文件添加到版本库中
git add :告诉Git,把文件添加到仓库
git commit -m "提交的说明":告诉Git,把文件提交到仓库
注意:提交修改和提交新文件都是需要两个步骤,add和commit

创建版本库以及添加提交文件.png

为什么Git提交文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

2. 查看状态

  1. 查看文件是否被修改过:git status
  2. 查看修改的内容:git diff

3. 查看提交的日志

  1. 不加参数:git log
  2. 加参数:git log --pretty=oneline
    出来的一大串数字是commit id(版本号)

4. 版本回退

进行多次修改后,想要回到某一个版本

  1. 回到上一个版本
    git reset --hard HEAD^
  2. 回到上上个版本
    git reset --hard HEAD^^
  3. 回到某个版本,比如往上100个版本
    git reset --hard HEAD~100
  4. 查看回退后的内容,比如查看readme.txt回退后的版本
    cat readme.txt
  5. 当新版本已经看不到看,又想回去时
    (1)如果在回退之前查看日志log,并且命令窗口还没被关掉,可以顺着往上查找,找到你想要回退的commit id,就可以执行回到最新版本
    git reset --hard 1094s
    版本号没必要写全,前面几位就可以了,Git会自动去找
    (2)如果在回退之前没有查看日志
    git reflog 记录每一条命令
    再通过回退版本号就可以了

5. 工作区和暂存区

  1. 工作区(Working Directory):电脑里能看到的目录
  2. 版本库(Repository)
    (1)工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
    (2)版本库有很多东西,版本库中有一个stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
  3. 提交文件的过程
    git add命令实际上就是把要提交的所有修改放在暂存区(Stage)


    add.png

    然后,执行git commit就可以一次性把暂存区的所有修改提交到分支上(master)


    commit.png

6. 撤销修改

git checkout 文件
(1)文件自修改后还没被放到暂存区(也就是还没有git add),把文件在工作区的修改全部撤销
(2)已经添加到暂存区,又作了修改,现在,撤销修改就回到添加到暂存区后的状态

7. 删除文件

在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt到Git并且提交。记住,必须先提交后才能进行删除文件。
(1)rm 文件
只把文件A从工作目录删除,而没有在暂存区进行删除,如果需要删除暂存区的文件,需要先git add,然后执行git commit -m "remove xxx",或者下面一种做法:
rm A
git commit -am "xxx"

(2)git rm 文件
相当于rm+git add,先把文件A从工作目录删除,再从暂存区删除文件A,最后执行git commit。
git rm A
git commit -m "xxx"

8. 远程仓库

Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。

实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。

这时候,GithHub就是我们的远程仓库,也就是充当服务器的角色,我们可以将本地仓库推送到远程仓库上。

本地Git仓库和远程仓库GitHub之间的传输是通过SSH加密(什么是SSH?https://www.jianshu.com/p/5b0351a4ad3d)的,所以我们要进行设置。
(1)创建SSH Key。在我们本地用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

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

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可。

如果一切顺利的话,可以在用户主目录里找到.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文件的内容。

为什么GitHub需要SSH Key呢?
因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送(因为你有对应的私钥)。

当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

9. 添加到远程库

在GitHub创建一个Git仓库,让本地仓库和Git仓库进行远程同步。
在添加到远程库之前,确保文件已经在本地仓库中(即已经git add和git commit)。
(1)在GitHub新建一个test仓库。
(2)在本地仓库下运行命令:

$ git remote add origin git@github.com:whitewhite123/test.git

(3)将内容推送到远程,用git push 命令,实际上是把当前分支master推送到远程。

$ git push -u origin master

第一次推送master分支时,需要加上-u 参数。Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,直接git push。

10. 从远程仓库克隆

git clone 远程仓库地址

$ git clone git@github.com:michaelliao/gitskills.git

11. 创建与合并分支

  1. 创建分支dev,然后切换到dev分支
    git checkout -b 分支名
$ git checkout -b dev

跟下面两句是一样的

//创建分支dev
$ git branch dev
//切换到分支dev
$ git checkout dev
  1. 切换分支
    git checkout 分支名
  2. 查看所有的分支
    git branch
    其中,有*号代表当前分支
  3. 合并分支
    git merge 分支名
    在其中一个分支做操作,另一个分支是看不到的,在最后可以进行合并。

(1)先切换到master分支

$ git checkout master

(2)然后将dev分支合并到master分支

$ git merge dev
  1. 删除分支
    合并完成后,就可以放心删除dev分支了
    git branch -d 分支名
    6.查看分支合并情况
    git log --graph --pretty=oneline --abbrev-commit

12. 分支管理

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
所以,要禁用Fast forward模式,使用--no-ff参数,表示禁用Fast forward。
当前在master分支,想要合并dev分支。

git merge --no-ff -m "merge with no-ff" dev

这样,就算后面删除dev分支,也可以用git log得到commit id,进行版本回退。

13. 解决冲突

(1)一开始,readme.txt的内容为:

aa

(2)在master分支下修改readme.txt的内容:

aa
bb

提交(add+commit)

(3)新建一个分支dev,然后修改readme.txt的内容:

aa
cc

提交(add+commit)

(4)切换到master分支,进行合并dev分支,会出现冲突,打开readme.txt

aa
<<<<<<< HEAD
bb
=======
cc
>>>>>>> dev

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。
我们进行修改,然后再进行提交,最后删除分支dev。

13.Bug分支

每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当你在dev分支的时候,你接到master分支上的一个代号101的bug的任务时,你需要去修复,但是dev分支的工作做到一半,还没法提交,这时候,你可以使用以下命令,将现场工作“储藏”起来,等恢复现场后继续工作。

  1. git stash 将当前现场隐藏
  2. 切换到master
    git checkout master
    用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
    (1)创建一个临时分支
    git checkout -b issue-101
    进行现场修复bug后提交
    (2)修复完成后,切换到master分支进行合并,并删除issue-101分支
  3. 重新回到dev分支
    (1)git stash list 查看
    工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下。
    (2)恢复现场
    第一种:git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
    第二种:git stash pop,恢复的同时把stash内容也删了。

(3)再用git stash list查看,就看不到任何stash内容了。

你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
git stash apply stash@{0}

14.强行删除

当你添加一个新功能时, 你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。

  1. 于是,开发一个新功能,添加一个分支
git checkout -b feature-new
  1. 切回master,准备合并
    当你要合并时,上级突然说撤销这个新功能,还必须就地销毁
    使用
git branch -d feature-new

销毁失败
所以必须强行销毁,使用-D

git branch -D feature-new

16. 推送分支(push)

  1. 查看远程库的信息
    git remote
    查看更详细的信息
    git remote -v
  2. 推送分支
    如果想把master分支进行推送
    git push origin master
    如果想推送其他分支,比如dev
    git push origin dev

但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!

17. rebase命令

git rebase 分支名:可以帮我们把整个提交历史变成干净清晰的一条线。
再使用 git log --graph --pretty=oneline --abbrev-commit查看分支合并情况

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