本教程针对Git的初学者
今天介绍一下之前刚刚学的版本控制利器——Git。其实说实在的版本控制,我真正算是会用也就是今年。之前以前用Github啥的客户端直接就图形化操作,然后自己搞也不会出现冲突啥的。所以也就只知道皮毛而已。
Git的背景在这里就不过多的交代了。Git可以说是当今使用范围最广的版本控制工具。由于“分支”概念的存在,所以特别是和多人合作,并行开发。好像之前大家用集中式版本管理工具SVN,我没用过所以不敢乱说。但是某东已经从SVN切换成了Git,想必Git必有过人之处吧。
个人学习使用Git的话,还是要有个可以操练的东西才行,可以选择Github和Visual Studio Team Services。Github是赫赫有名的开源项目托管的网站,缺点是免费用户的代码是开源的。VSTS的话,是微软的代码托管服务,如果是个人小团队(5人以下?)则可以免费使用。优点是代码闭源。
今天以VSTS为例,和我一起走一波连接Git的远程仓库,毕竟连上了远称仓库之后,想怎么玩就怎么玩了,Git光看效果不大,还是要操练起来才行。
01.下载安装Git,并在VSTS上新建一个项目
去官网下载Git,然后一路下一步安装。(额,默认以windows为准了哈)

安装好Git之后,打开Git Bash,首先利用ssh-keygen命令来创建公钥,直接用默认路径就好,密码也可以留空,所以只需要敲击三次回车即可。随后用cat ~/.ssh/id_rsa.pub命令来查看生成的密钥。密钥稍后用。

注册了微软账号之后,登陆应该要先建一个Team,因为我很久之前就建好了,这里就不演示了。然后在点击New Project。

填写Project name,Version control选择Git。工作流目前先默认就行,想要了解更多就去外链上看下吧。

创建成功了,选择SSH。后面的就是远程仓库地址。下不要关闭页面。

点击Manage SSH Keys后,在弹出的页面上点击Add。将刚刚生成的密钥填写进去并Save

回到刚才说不要关闭页面的页面,对项目进行初始化,展开下面的选项,并点击Initialize。

至此,项目就创建成功了。授权也弄好了。
02.Clone项目
在Git Bash页面,然后进入到我们想要下载代码的文件夹中。输入git clone 远称仓库地址。因为Git Bash中的命令和linux中的一样,这里就不赘述了。

Git的官方介绍已经很详细了,现在已经有了环境,就可以边看官方教程边学习了。除了官方的文档以外,廖雪峰老师的教程以及[菜鸟教程](https://www.runoob.com/git/git-tutorial.html也很不错。
xx.附录-常用Git命令
git 的使用
| 命令 | 简介 | 备注 |
|---|---|---|
| git –version | 查看git版本 | |
| git clone xxx | 克隆仓库 | |
| git add ./xixi/heihei.txt | 将文件heihei.txt添加至staging area | |
| git add . | 将当前目录下的所有文件加入到staging area | |
| git commit -m ‘添加一个heihei.txt文件’ | 将staging area中的文件提交到仓库 | |
| git reset ./xixi/heihei.txt | 撤销添加到staging area中的指定文件 | |
| git status | 查看当前仓库的状况 | |
| git fetch | 从远程仓库获取最新的信息 | |
| git pull | 获取远程仓库的最新版本并合并到本地 | |
| git push | 将本地修改推到远程仓库 | |
| git branch dev-xixi | 以当前分支创建一个dev-xixi的分支 | 也可以用git checkout -b dev-xixi |
| git branch -al | 查看本地及远程的所有分支 | |
| git remote -v | 查看git的服务器地址 | 使用q来退出 |
| git remote show origin | 提供有关远程的一些信息 | 也可以看到远程地址 |
| git help remote | 查看remote的详细说明 | |
| git blame -L 123,125 ./xixi/heihei.txt | 查看heihei.txt文件第123-125行最新的修改人及时间 | 去掉 -L也可以,就是查全文,按q来退出 |
| git restore ./ | 还原改动的文件 | |
| git clean | 清除未track的文件或文件夹,不能直接使用,一定要跟参数 | -n 显示要删除哪些文件 -f 删除文件 -df 删除文件及文件夹 |
| git log | 查看历史提交(复杂模式) | git log –oneline |
git checkout的使用
| 命令 | 简介 | 备注 |
|---|---|---|
| git checkout dev | 切换至dev分支 | |
| git checkout –– templates/index.html | 放弃本地尚未commit的修改 | 谨慎使用,除非使用了git stash,不然只能去local history里面找之前的代码了 |
| git checkout . | 放弃本地尚未commit的所有修改 | 同上 |
git config的使用
| 命令 | 简介 | 备注 |
|---|---|---|
| git config ––global user.name “liutianyu” | 设置全局的用户名 | |
| git config ––global ––list | 列出所有全局的配置项 | |
| git config ––local ––list | 在一个git repository下面使用,查看当前的配置 | |
| git config ––local user.name “liutianyu” | 设置局部用户名 | |
| git config ––local user.email “liutianyu@x.com” | 设置局部邮箱 | |
| git config ––system ––unset credential.helper | 清除登录信息 | |
git stash的使用
| 命令 | 简介 | 备注 |
|---|---|---|
| git stash save “xixi” | 创建名为“xixi”的stash,并将当前的工作区回归为初始状态。 | |
| git stash list | 列出当前所有的stash | |
| git stash appley 0 | 将序列号为0的stash中的内容恢复到当前的工作区,并且不删除 | |
| git reset ––hard HEAD | 强制将当前的改动删掉,回归到初始状态。 | |
| git stash pop 0 | 将序列号为0的stash中的内容恢复到当前的工作区,并且删除 | |
| git stash drop 0 | 删除序列号为0的stash | |
| git stash clear | 清空stash中的所有内容 | |
commit后回滚
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
gitpod /workspace/furybrand.github.io $ git push
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 16 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 418 bytes | 418.00 KiB/s, done.
Total 5 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/FuryBrand/furybrand.github.io.git
! [remote rejected] master -> master (refusing to allow an OAuth App to create or update workflow `.github/workflows/jekyll.yml` without `workflow` scope)
error: failed to push some refs to 'https://github.com/FuryBrand/furybrand.github.io.git'
gitpod /workspace/furybrand.github.io $ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
gitpod /workspace/furybrand.github.io $ git reset --soft HEAD^
gitpod /workspace/furybrand.github.io $ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: .travis.yml -> ..travis.yml
modified: .github/workflows/jekyll.yml
gitpod /workspace/furybrand.github.io $ git restore .github/workflows/jekyll.yml
gitpod /workspace/furybrand.github.io $ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: .travis.yml -> ..travis.yml
modified: .github/workflows/jekyll.yml
gitpod /workspace/furybrand.github.io $ git restore .github/workflows/jekyll.yml --staged
gitpod /workspace/furybrand.github.io $ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: .travis.yml -> ..travis.yml
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: .github/workflows/jekyll.yml
gitpod /workspace/furybrand.github.io $ git restore .github/workflows/jekyll.yml
gitpod /workspace/furybrand.github.io $ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: .travis.yml -> ..travis.yml
git初始化仓库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Command line instructions
You can also upload existing files from your computer using the instructions below.
Git global setup
git config --global user.name "liutianyu"
git config --global user.email "liutianyu@x.com"
Create a new repository
git clone git@git.jd.com:class6/itat-auto-test.git
cd itat-auto-test
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
Push an existing folder
cd existing_folder
git init
git remote add origin git@git.jd.com:class6/itat-auto-test.git
git add .
git commit -m "Initial commit"
git push -u origin master
Push an existing Git repository
cd existing_repo
git remote rename origin old-origin
git remote add origin git@git.jd.com:class6/itat-auto-test.git
git push -u origin --all
git push -u origin --tags
删除所有提交记录
因为拿git当作笔记软件,时间久了提交记录越来越多会导致.git文件夹非常臃肿(主要是存了一些二进制文件,我承认我的路子有点野,但是在内网同步盘不可用的情况下,git貌似是唯一的好用的云笔记选择了) 下面的步骤是
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
liutianyu@LX-WXZB MINGW64 /d/myWorkspace
$ mv furybrand/ furybrand1
liutianyu@LX-WXZB MINGW64 /d/myWorkspace
$ mkdir furybrand
liutianyu@LX-WXZB MINGW64 /d/myWorkspace
$ cd furybrand
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand
$ git init
Initialized empty Git repository in D:/myWorkspace/furybrand/.git/
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ vi README.md
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ cp ../furybrand1/.git
./ ../ .git/ .gitignore .vscode/
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ cp ../furybrand1/.git/co
COMMIT_EDITMSG config
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ cp ../furybrand1/.git/co
COMMIT_EDITMSG config
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ cp ../furybrand1/.git/config ./.git/
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ git add .
warning: LF will be replaced by CRLF in README.md.
The file will have its original line endings in your working directory
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ git commit -m "Initial commit"
[master (root-commit) 54d05a4] Initial commit
1 file changed, 1 insertion(+)
create mode 100644 README.md
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ git push -f --set-upstream origin master
info: detecting host provider for ''...
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 210 bytes | 210.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Coding: Checking the pushed content...
remote: Updating references: 100% (1/1)
Branch 'master' set up to track remote branch 'master' from 'origin'.
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ cp ../furybrand1/* ./ -r
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ git add .
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ git commit -m "go"
[master 3e207dc] go
142 files changed, 428831 insertions(+), 1 deletion(-)
create mode 100644 PRODUCT/README.md
create mode 100644 temp.md
liutianyu@LX-WXZB MINGW64 /d/myWorkspace/furybrand (master)
$ git push
info: detecting host provider for ''...
Enumerating objects: 164, done.
Counting objects: 100% (164/164), done.
Delta compression using up to 8 threads
Compressing objects: 100% (161/161), done.
Writing objects: 100% (163/163), 89.59 MiB | 1.59 MiB/s, done.
Total 163 (delta 10), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (10/10)
remote: Coding: Checking the pushed content...
remote: Updating references: 100% (1/1)
54d05a4..3e207dc master -> master
更新日志
- 2020年9月23日:追加回滚操作
- 2021年12月1日:追加“删除所有提交记录”