git常用命令结合若干个使用场景

目录

一、工作区、暂存区和仓库

二、创建本地仓库后,关联到git远程库

三、从远程库clone项目至本地

四、git其他常用命令

五、分支管理


一、工作区、暂存区和仓库

在学习git命令之前,我们先来了解一下工作区、暂存区和仓库(也叫:版本库)之间的关系。

1. 先在本地创建目录(文件夹):myProject,或者直接进入已存在的目录下也行

2. 然后通过命令: git init  ,把目录变成Git可管理的仓库,即初始化Git仓库

3. 在目录myProject下新增文件 index.txt,内容随便写。然后通过以下两个命令,把文件添加并提交到仓库

  1)git add .   # 添加文件到仓库,其中.代表所有有变动的文件,也可以把点换成某个具体的文件名

  2)git commit -m 'add index.txt'  # 提交文件到仓库

changyixuedeMacBook-Pro:~ ychang$ cd /Users/ychang/myProject
changyixuedeMacBook-Pro:myProject ychang$ ls
changyixuedeMacBook-Pro:myProject ychang$ git init
Initialized empty Git repository in /Users/ychang/myProject/.git/
changyixuedeMacBook-Pro:myProject ychang$ ls
index.txt
changyixuedeMacBook-Pro:myProject ychang$ git add .
changyixuedeMacBook-Pro:myProject ychang$ git commit -m 'add index.txt'
[master (root-commit) 0f9313c] add index.txt
 1 file changed, 1 insertion(+)
 create mode 100644 index.txt

接下来就根据上述操作,具体讲解工作区、暂存区和仓库的概念。

1. 工作区:就是本地的目录,也就是myProject文件夹

2. 仓库(版本库):工作区内有一个隐藏的目录.git,就是Git的仓库。仓库里存放了暂存区、还有第一个分支master,以及指向master的一个指针HEAD

3. 暂存区:暂存区存在于Git的仓库里,称为stage

4. git add 就是把本地的文件修改添加到暂存区(stage);

    git commit 就是把暂存区的内容提交到当前分支

5. 工作区、仓库(版本库)和暂存区(stage)的关系如下图所示,图片来自廖雪峰老师的文章:Git教程

二、创建本地仓库后,关联到git远程库

 1. 已经创建了本地仓库myProject,如果想关联到git远程库,则需要先在gitHub上创建Repositories后,复制仓库的地址,比如:https://github.com/XXX/myProject.git

 2. 把本地库关联到远程库:git remote add origin https://github.com/XXX/myProject.git

 3. 把本地库所有内容推送到远程库上:git push -u origin master

其中 -u 只需要在第一次push时使用,以后的push都可以省略

 4. 后续添加、提交和推送本地的修改:1) git add .  2) git commit -m 'remarks'  3) git push origin master   

备注:可以多次add,然后一次性commit。同理,也可以多次commit,一次性push

三、从远程库clone项目至本地

1. 如果先创建了远程库myProject,则需要从远程库上clone项目到本地:git clone https://github.com/XXX/myProject.git

2. 更新已clone到本地项目:git pull

3. 添加、提交和推送本地的修改:1) git add .  2) git commit -m 'remarks'  3) git push origin master  (参照二、中的步骤4)

四、git其他常用命令

1. 查看仓库状态和文件修改内容

  1)查看仓库当前的状态:git status

  2)查看某文件具体修改的内容:git diff <fileName>

场景1:比如在本地修改了文件index.txt后,add之前,我们可以先用git status查看本地仓库有变动的文件状态。那如果我们想看看某文件具体修改了哪些内容,就可以用git diff <fileName>

场景2:add之后,commit之前,可以使用git status查看当前仓库的状态,会提示我们将要被提交的内容

2. 版本回退

  1)查看当前分支已经提交(commit)到git仓库的历史记录:git log  或者 git log --pretty=oneline

  2)  回退到某个版本: git reset --hard <commit_id>/HEAD/HEAD^/...

       其中commit_id是指每次commit后的版本号(commit id),可以用git log --pretty=oneline查看;

       HEAD表示当前版本,HEAD^表示上一个版本。也就是说可以指定commit id(取id的前7位就行),也可以直接使用HEAD、HEAD^等代表某个版本

  3)  查看所有分支提交的操作记录:git reflog

       如果版本回退到上一个版本(HEAD^)后,又想回退到最新版本(HEAD)怎么办?这时候用git log是看不到最新版本的id和提交信息的。可以用git reflog,看到之前提交的最新版本的id和提交信息。然后使用git reset --hard 600ba67  (commit id取自下图红框中id),就可回退到最新版本。

3. 撤销修改

   1)工作区(本地)修改后,撤销修改:

    git checkout -- <fileName>   # 撤销本地的修改,或者自己在本地手动恢复

   2)  添加(add)到暂存区后,撤销修改:

    git reset HEAD <fileName>   # 先把暂存区的修改回退到工作区

    git checkout --  <fileName>   # 再把工作区的修改撤销

   3)提交(commit)到仓库后,撤销修改:

   git reset --hard <commit_id>/HEAD/HEAD^/...     # 参考”版本回退“

   4)推送(push)到远程库后,撤销修改:

    回退到上一个commit id(参考”版本回退“),然后重新push。但是远程库还是有记录的,撤销只是针对工作区和版本库的撤销,远程的记录撤销不了的。

4. 删除文件

  1)删除本地已经提交过的文件:

     rm <fileName>        # 先在本地删除文件,或者自己在本地手动删除

     git rm <fileName>    # 再从版本库中删除该文件,或者直接git add <fileName> 也行

     git commit -m 'delete fileName'    # 最后提交,文件就从版本库中被删除了

  2)删除已经提交过的文件后,又想要恢复文件:

    rm <fileName>        # 先在本地删除文件,或者自己在本地手动删除 

    git checkout -- <fileName>   # 再把误删的文件,从版本库中恢复到本地

备注:git checkout 是用版本库中的版本替换工作区的版本,工作区被误修改或者删除,均可还原。

五、分支管理

1. master分支,也叫主分支,可以理解为每次提交后的版本都被git串在一起,形成一条时间线,这条时间线就是master分支,所以master是指向提交的。且每次提交,master分支都会向前移动一步

2. HEAD,可以理解为指向master的一个指针。所以HEAD指向当前分支。时间线、master和HEAD的关系如下图所示:

3. 若创建新的分支,例如dev。相当于git创建了一个指针叫dev,首先指向master相同的提交,然后再把HEAD指向dev,就表示当前分支在dev上。

4. 创建并切换到分支dev后,工作区的修改和提交就是针对dev分支了。比如新提交一次后,dev指针往前移动一步,而master指针不变。

5. 如果在dev分支上完成了工作,怎么把dev合并到master上呢?直接把master指向dev的当前提交,就完成了合并

6. 查看、创建、切换、合并和删除分支:

  1) 查看分支:git branch   # 当前分支前会标*

  2) 创建分支:git branch <branchName>

  3) 切换分支:git switch <branchName> 或者 git checkout <branchName>

  4) 创建并切换分支:git switch -c <branchName>  或者 git checkout -b <branchName>

  5) 合并某分支到当前分支:git merge <branchName>

  6) 删除分支:git branch -d <branchName>

7. 存储当前工作现场:

 1)在分支dev下存储已经修改过的内容:git stash

 2)切换到别的分支后继续工作:git checkout <branchName>

 3)恢复存储的内容到切换后的分支:git stash pop

未完待续。。。

备注:本文只用作学习总结,不做其他用途。详细内容可参考廖雪峰老师的文章:Git教程


版权声明:本文为changyixue原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。