熟悉Git
Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git的运用范围很广,会很简单但经常想不起来怎么用,本文档涵盖clone,pull,push,fork,merge等操作。
目录
- 1 在Github上创建一个测试项目
- 2 下载代码
- 3 提交更新
- 4 上传代码
- 5 Git仓库更新代码
- 6 新建分支
- 7 切换分支
- 8 版本回退
- 9 .gitignore
前期准备
安装Git工具 Git下载地址
Git的基本概念:
Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。
创建测试项目
-
首先在Github中创建一个test项目用于Git操作的测试
- 然后获取远程仓库的url(下图红框部分),之后会通过这个地址连接至服务器端。
下载代码
- 在要进行Git管理的文件夹下 右键->Git Bash Here 调出命令行界面
- 命令行界面可以使用任何终端(Terminal)界面,然后切换至相应文件夹下即可。
- 第一次的代码下载非常的简单,只需运行命令 git clone [url] 等待运行结束即可。这里的url为上文远程仓库的地址。
$ git clone https://github.com/marchshi/test.git
执行完这条命令后,就可以得到远程存储库的全部文件。
Git是一个开源的分布式版本控制系统,每个开发者通过克隆,在本地机器上拷贝一个完整的Git仓库。
提交更新
在项目中有一个 /.git 的隐藏文件夹,它是Git的版本库,存储着版本变动的全部信息。其中有三个重要内容:版本变动信息,指向当前commit的HEAD指针,暂存区。
我们向Git版本库添加文件要分两步进行的:将文件修改添加到暂存区,将暂存区的内容提交到当前分支。
将文件添加到暂存区
- 在项目中新建一个文件
$ touch newfile.txt
- 将此文件添加至暂存区中
$ git add newfile.txt
- 使用git status 命令查看当前暂存区中的内容
$ git status
On branch master
Your branch is up-to-date with 'test/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
new file: newfile.txt
上面显示我们较之前的commit多了一个newfile.txt的文件。
commit提交更改
git commit 命令可以直接将暂存区的文件进行提交.-m 参数可以对提交添加描述
$ git commit -m "first commit"
[master 2a57bdf] first commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 newfile.txt
命令执行完就提交成功了,。此时暂存区中没有任何文件。
$ git status
On branch master
Your branch is ahead of 'test/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
需要注意的是,Git绝大多数操作都无需联网,直接在本地版本库进行操作。如果我们要上传代码,就得先使本地分支与远程分支融合,才能向远程分支上传代码。
上传代码
上传代码之前要做好以下准备工作:
- 查看远端仓库的URL
$ git remote -v
origin https://github.com/marchshi/test.git (fetch)
origin https://github.com/marchshi/test.git (push)
如果不存在,可以使用 git remote add
PS:可以使用git branch --set-upsteam master origin/master 设置默认上传地址和分支。
The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
- 查看当前所在的分支
$ git branch
* master
- 使本地分支与远程分支融合(更新本地代码库)
git pull origin master
- 提交文件至远程库(别名origin)的master分支
$ git push -u origin master
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 546 bytes | 0 bytes/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To https://github.com/marchshi/test.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
输入完这条命令后会跳出用户名和密码的输入框,输入你的github账号即可。
至此代码提交成功,我们可以使用git log查看提交信息。
Git仓库更新代码
在更新代码前,要和上传代码前一样,检查远端服务器URL和当前所在分支。
并且用 git status命令查看本地暂存区的信息,确保更新不产生冲突。
$ git status
On branch master
Your branch is ahead of 'test/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
更新代码非常的简单,也是一行命令
$ git pull origin master
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/marchshi/test
* branch master -> FETCH_HEAD
8f4c1fa..03653e1 master -> test/master
至此代码更新成功。
新建分支
首先熟悉一些基本命令
- 列出所有本地分支和远程分支
$ git branch -a
* master
remotes/test/master
- 新建一个develop分支
$ git branch develop
- 切换到新建的 develop 分支
$ git checkout develop
Switched to branch 'develop'
- 在新的分支进行一次提交
$ touch fileB.txt
$ echo -n "fileB:second commit branch:develop" > fileB.txt
$ git add fileB.txt
$ git commit -m "second commit"
- 在远程新建一个develop分支提交本地的develop分支
$ git push origin develop:develop
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 331 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/marchshi/test.git
* [new branch] develop -> develop
这里要注意一下:这次提交代码并不需要pull操作。因为新建的分支是本地分支的复制,不存在冲突。
- 这时我们在查看一下存在的所有分支
$ git branch -a
* develop
master
remotes/origin/HEAD -> origin/master
remotes/origin/develop
remotes/origin/master
这样新建分支并提交代码就完成了。
切换分支
Git可以通过HEAD指针灵活的切换分支,/.git目录下HEAD文件保存着当前版本的指向。
$ cat .git/head
ref: refs/heads/develop
我们可以看见代码指向了 refs/heads/develop 文件,那这个文件的内容又是什么呢?
$ cat .git/refs/heads/develop
5b437a4c89b07e51844463e11558aa24cc6debc8
develop文件又指向了一个SHA-1值,它其实是一个commit对象的索引。我们继续查看。
$ git cat-file -p 5b437a
tree e0f11cc274657c9cc5f48d59b2da15810245ff0c
parent a9f5b0fc23589b3b7b3f97c8e8b8b7a5f6c07b5e
author marchshi <[email protected]> 1507863623 +0800
committer marchshi <[email protected]> 1507863623 +0800
second commit
里面保存了此时提交的tree对象的索引,以及父commit的索引,外加一些提交的信息。
那这对我们切换分支有什么帮助呢?其实切换分支就是修改HEAD所指向的commit对象,然后通过commit对象遍历其父commit和文件tree对象进行数据还原。
我们还是通过命令看一下效果
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
a9f5b0fc23589b3b7b3f97c8e8b8b7a5f6c07b5e
$ git cat-file -p a9f5b0
tree 55fb26b86f99150325059ff02833ed637728ea35
parent d0eb485dded132c8cb98ad0800c1b6d01a89ee6f
author marchshi <[email protected]> 1507863182 +0800
committer marchshi <[email protected]> 1507863182 +0800
first commit
这是我们发现HEAD指针已经指向了master分支的first commit对象。接下来就是见证奇迹的时刻~~~
$ ll
total 2
-rw-r--r-- 1 shimanqian 197121 23 十月 13 10:52 fileA.txt
-rw-r--r-- 1 shimanqian 197121 6 十月 13 10:50 README.md
我们可以看到,second commit提交的fileB.txt文件已经消失了,是不是很神奇呢?再重复尝试一下。
$ git checkout develop
Switched to branch 'develop'
$ ll
total 3
-rw-r--r-- 1 shimanqian 197121 23 十月 13 10:52 fileA.txt
-rw-r--r-- 1 shimanqian 197121 35 十月 13 11:34 fileB.txt
-rw-r--r-- 1 shimanqian 197121 6 十月 13 10:50 README.md
至此,切换分支成功。
版本还原
如果发现提交错误,想回退到上一个版本也非常简单。原理和切换分支相同,只要修改HEAD的指向就行。
首先查看一下当前分支的提交记录
$ git log
commit 5b437a4c89b07e51844463e11558aa24cc6debc8
Author: marchshi <[email protected]>
Date: Fri Oct 13 11:00:23 2017 +0800
second commit
commit a9f5b0fc23589b3b7b3f97c8e8b8b7a5f6c07b5e
Author: marchshi <[email protected]>
Date: Fri Oct 13 10:53:02 2017 +0800
first commit
想要切换到哪个commit呢就直接checkout到它的commit-id(前六位)即可。
$ git checkout a9f5b0
HEAD is now at a9f5b0f... first commit
$ cat .git/head
a9f5b0fc23589b3b7b3f97c8e8b8b7a5f6c07b5e
这时就可以版本回退到第一次提交了。当然我们也可以使用HEAD关键字。
$ git checkout HEAD^
该条命令可以直接回退到当前提交的上一次提交,也就是它的父commit。
补充:版本回滚可以新拉一个分支,在新的分支上执行 git reset --head xxx(commet对象名)
打标签
创建一个含附注类型的标签 -a annotated
git tag -a v1.4 -m 'my version 1.4'
.gitignore
当我们上传代码的时候,代码文件夹中有一些第三方的库文件或其他不想上传的文件。我们可以在add的时候挑选出自己想提交的文件,但也可能用更便捷的方式:在.gitignore中标明我们不想提交的文件。这样在git add的时候就会忽略这些文件的存在。
~~~
node_modules/
~~~