一、简介

image.png

  • 工作区域(Working Directory):你平时存放项目代码的地方。
  • 暂存区域(Stage):用于临时存放你的改动,事实上它只是一个文件,保存即将提交的文件列表信息。
  • Git 仓库(Repository):就是安全存放数据的位置,存放你提交的所有版本的数据。其中,HEAD 指向最新放入仓库的版本(这第三棵树,确切的说,应该是 Git 仓库中 HEAD 指向的版本)。

修改文件->git add -> git commit -> git push
Git 的工作流程一般是:

  1. 在工作目录中添加、修改文件;
  2. 将需要进行版本管理的文件放入暂存区域;
  3. 将暂存区域的文件提交到 Git 仓库。
    因此,Git 管理的文件有三种状态:已修改(modified)、已暂存(staged)和已提交(committed),依次对应上边的每一个流程。
1
2
3
4
5
6
7
8
9
10
 // 1.初始化Git项目,成功后创建有一个.git隐藏文件
F:\MyProject>git init
Initialized empty Git repository in F:/MyProject/.git/
// 2.在文件夹MyProject中添加一个文本文件README,然后输入以下命令将文件加入暂存区
F:\MyProject>git add README.md
// 3.将文件提交到git仓库(-m表示添加本次提交的说明,强制要求写的)
F:\MyProject>git commit -m "add a readme file"
[master (root-commit) 9e08cf4] add a readme file
1 file changed, 1 insertion(+)
create mode 100644 README.md

在Git中,HEAD是一个指针,它始终指向当前所在的分支的最新提交。
其实所谓的:neiwang、waiwang、origin,都只不过是.git/refs/remotes/下的一个文件夹名称而已.

二、命令详解

1.配置

全局配置文件路径: C:\Users\登录用户名\.gitconfig文件,内容如下:

1
2
3
4
5
6
7
8
9
10
[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
[safe]
directory = D:/git/项目1
[user]
name = username1
email = xxx@xx.com

(1) 配置用户名

设置当前仓库的用户名和邮箱(git只需要用户名和邮箱登录)
git config user.name “New Username”
git config user.email ‘xxx@xx.com’
设置全局用户名(增加 --globa 参数)
git config --global user.name “New Global Username”

(2)查看

1
2
3
4
5
git config --global user.name
git config --global user.email

# 查看所有的配置
git config --global --list

2.克隆现有的仓库

git clone <远程库地址>
功能:①完整的克隆远程库为本地库,②为本地库新建origin别名,③初始化本地库

1
git clone https://github.com/algz/ant-design-pro-vue.git

3.分支管理

(1) 新建本地分支

git branch <分支名>

1
>git branch algz

(2) 查看分支

1
>git branch      // 查看当前本地分支

1
>git branch -r   // 查看所有远程分支

1
>git branch -a   // 查看本地和所有远程分支

(3) 删除分支

-D 不提示直接删除,-d 提示确认再删除。

1
>git branch -d  <分支名>

(4)合并分支

将<指定分支名>代码合并到当前分支。

1
>git merge <指定分支名>

合并时有二种情况:
a. 当前分支没修改,直接提交更改(commit)。
b.当前分支已修改,会出现一个新的merge提交点。

1
>git rebase <指定分支名>

合并时的第二种情况,不会出现新的merge提交点,所以建议用rebase.

(5)重置(reset)或恢复(revert)代码到指定提交

重置:

git reset hand HEAD^
二种重置方法:
a.软件重置,代码恢复到指定的提交,保留变更的代码。
b.硬重置,代码恢复到指定的提交,不保留变更的代码。

恢复:
还原代码到指定的提交

git revert <提交>

(6)切换当前分支

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
git checkout -b (branchname) 命令来创建新分支并立即切换到该分支下,从而在该分支中操作。

1
>git checkout algz

5.推送数据

origin 是仓库链接的别名,只不过仓库链接太长了,直接写链接多不方便,于是就搞了个标记,用它来代表它就是那个仓库链接。
(1)将本地的 master 分支推送到 origin 主机的 master 分支。

1
2
3
4
5
6
7
git push origin master

# 第一次提交加 -u参数后,后面的提交就直接可以 git push
# git push -u origin master

# 等效 git push -u origin master
git push -u https://github.com/zhangsan/test.git master

(2)如果本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数:

1
git push --force origin master

(3)删除主机的分支可以使用 --delete 参数,以下命令表示删除 origin 主机的 master 分支:

1
git push origin --delete master

4.回退提交

1
2
3
4
5
6
7
8
# git log 按顺序获得提交ID / git reflog 按时间点查看回退,获得提交ID

# (1)回退远程到指定的提交ID
git reset 提交ID
# (2) 是回滚本地
# git reset --hard 提交ID

# git commit 回退后,需重新提交。

eclipse 回退方法:
(1) 回退到指定提交ID

1
git reset 提交ID;

(2) 还原修改
Assume unchanged

(3) 推送到远程

三、常见问题

1.git branch -r 远程分支显示不全

[!问题描述:]
git 查看项目远程分支,返回结果很少。但GitHub页面上能看到很多的分支。尝试git remote update,发现结果仍然如此。

PS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
C:\Users\dell\go\src\k8s.io\kubernetes> git remote update                          
remote: Enumerating objects: 1334961, done.
remote: Counting objects: 100% (1334920/1334920), done.
...
Resolving deltas: 100% (981759/981759), completed with 7193 local objects.
From https://github.com/kubernetes/kubernetes
49768134e52..160fe010f32 master -> origin/master
* [new tag] v0.10.0 -> v0.10.0
* [new tag] v0.11.0 -> v0.11.0
...
* [new tag] v1.9.0-alpha.3 -> v1.9.0-alpha.3
PS C:\Users\dell\go\src\k8s.io\kubernetes> git branch -r
origin/HEAD -> origin/master
origin/master

原因分析:
当初拉取项目时,使用了 git clone --depth=1 …
If you clone with the --depth parameter, it sets .git/config not to fetch all branches, but only master.

解决方法:
在项目的 .git/config 文件中,修改一行:
You can simply omit the parameter or update the configuration file from / 找到这一行:

1
fetch = +refs/heads/master:refs/remotes/origin/master

to / 改成:

1
fetch = +refs/heads/*:refs/remotes/origin/*