目录
一、工作区、暂存区和仓库
在学习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教程