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查看分支合并情况

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。