Git是分布式版本控制系统,主要用于代码或者项目的版本控制。
Git安装
打开Git官网下载安装程序,默认安装即可。
安装完成后,打开Git bash软件,弹出一个类似cmd的命令行窗口,就证明安装成功。
接下来,在命令行输入以下代码设置你的名字和Email地址:
$ git config --global user.name "Your Name"$ git config --global user.email "email@example.com"
创建版本库
版本库(repository)也叫仓库,可以看做一个目录,这个目录里的所有文件都由Git进行管理,每个文件的修改、删除,Git都能跟踪。
1.选择空文件夹,创建一个空目录:
如果使用Windows系统,要保证目录名不包含中文。
2.通过以下命令把这个目录变成Git可以管理的仓库:
$ git initInitialized empty Git repository in /Users/Administrator/learngit/.git/
这样Git就把仓库建好啦,在当前目录下就会多一个 .git 的目录,这个目录是Git来跟踪管理版本库的。
3.把文件添加到版本库
我们在 learngit 目录下编写一个 readme.txt 文件,内容如下:
Git is a version control system.Git is free software.
(1) 用 git add 命令,把文件添加到仓库:
$ git add readme.txt
执行以上命令,没有任何显示。
(2) 用 git commit 命令,把文件提交到仓库:
$ git commit -m "wrote a readme file" //-m后面输入的是本次提交的说明,可以输入任意内容。[master (root-commit) eaadf4e] wrote a readme file 1 file changed, 2 insertions(+) //1 file changed:1个文件被改动(新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt内有两行内容) create mode 100644 readme.txt
4.修改文件
我们已经成功添加并提交了一个 readme.txt 文件,继续修改 readme.txt 文件,改成如下内容:
Git is a distributed version control system.Git is free software.
运行 git status 命令:
$ git status //查看仓库当前的状态On branch masterChanges not staged for commit: //没有文件将要被提交 (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a")
上面的命令告诉我们,readme.txt 文件被修改过了,但还没有准备提交的修改。
如果我们想知道上次是怎么修改readme.txt 文件的,需要用 git diff 命令:
$ git diff readme.txt diff --git a/readme.txt b/readme.txtindex 46d49bf..9247db6 100644--- a/readme.txt+++ b/readme.txt@@ -1,2 +1,2 @@-Git is a version control system. //这一句是被删掉的+Git is a distributed version control system. //这一句是新添加的 Git is free software.
接下来还是那两步:
(1) git add
$ git add readme.txt
没有任何输出,这时候可以用 git status 查看一下当前仓库状态:
$ git statusOn branch masterChanges to be committed: //将要被提交的文件包括 readme.txt (use "git reset HEAD ..." to unstage) modified: readme.txt
(2) git commit
$ git commit -m "add distributed"[master e475afc] add distributed 1 file changed, 1 insertion(+), 1 deletion(-)
再用 git status 查看一下当前仓库状态:
$ git statusOn branch masternothing to commit, working tree clean //当前没有需要提交的修改,而且,工作目录是干净的。
版本回退
如果我们继续对 readme.txt 文件进行修改成如下内容:
Git is a distributed version control system.Git is free software distributed under the GPL.
然后添加并提交:
$ git add readme.txt$ git commit -m "append GPL"[master 1094adb] append GPL 1 file changed, 1 insertion(+), 1 deletion(-)
到目前为止,readme.txt 文件一共有三个版本被提交到了 Git 仓库里,我们可以用 git log 命令进行查看:
$ git log //查看历史记录commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)Author: Michael Liao Date: Fri May 18 21:06:15 2018 +0800 append GPL commit e475afc93c209a690c39c13a46716e8fa000c366Author: Michael Liao Date: Fri May 18 21:03:36 2018 +0800 add distributed commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0Author: Michael Liao Date: Fri May 18 20:59:18 2018 +0800 wrote a readme file
如果想把 readme.txt 文件退回到上一个版本,就可以使用 git reset 命令:
$ git reset --hard HEAD^ //HEAD表示当前版本,则HEAD^表示上一个版本,那么上上版本就是HEAD^^H
这时候查看一下 readme.txt 的内容,就会发现文件已经返回上一个版本:
$ cat readme.txt
现在想要回到最新的版本,还是使用 git reset 命令:
$ git reset --hard 1094a
这时再查看readme.txt 文件内容,就是最新版本:
$ cat readme.txtGit is a distributed version control system.Git is free software distributed under the GPL.
工作区和暂存区
工作区(Working Directory)
learngit 文件夹就是一个工作区。
版本库(Repository)
工作区有个隐藏目录 .git ,这个不算工作区,而是 Git 的版本库。
版本库里面的 index(stage) 文件叫暂存区,还有Git为我们自动创建的第一个分支 master ,以及指向 master 的一个指针叫做 HEAD。
要把文件添加到Git里面时,需要分两步:
第一步是用 git add 把文件添加进去,实际上就是把文件修改添加到暂存区。
第二步是用 git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支。
通常我们用IDE或者sourcetree这样的可视化管理工具,这两步并不是很明显。
撤销修改
假如说你在 readme.txt 文件中添加了一行内容如下:
$ cat readme.txtGit is a distributed version control system.Git is free software distributed under the GPL.Git has a mutable index called stage.Git tracks changes of files.My stupid boss still prefers SVN.
最后一行怎么撤销呢?
(1) 没有 git add 之前
可以手动删除最后一行,手动把文件恢复到上一个版本的状态。然后再用 git checkout -- file 命令丢弃工作区的修改:
Git is a distributed version control system.Git is free software distributed under the GPL.Git has a mutable index called stage.
(2) git add了,但没有git commit
这时候的修改添加到了暂存区,但没有提交到分支,用 git status 查看一下:
$ git add readme.txt$ git status# On branch master# Changes to be committed:# (use "git reset HEAD ..." to unstage)## modified: readme.txt#
这时候我们可以使用 git reset HEAD file 命令把把暂存区的修改撤销掉,重新回到工作区:
$ git statusOn branch masterChanges to be committed: (use "git reset HEAD ..." to unstage) new file: LICENSE modified: readme.txt
(3) 既 git add 了,也 git commit 了就只能回退版本了。
删除文件
在工作区即 learngit 文件夹下新建一个 test.txt 文件,并添加和提交到Git:
$ git commit -m "git tracks changes"[master 519219b] git tracks changes 1 file changed, 1 insertion(+)
这时候可用 rm 命令删除:
$ git statusOn branch masterChanges not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: readme.txt no changes added to commit (use "git add" and/or "git commit -a")
创建和合并分支
Git开发会有很多分支,通常主干都是master分支。多人合作的时候,就需要从master拉出分支来进行开发,开发结束后合并到master分支,这样既不会影响到其他人开发,也不会耽误自己的开发。
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name
创建+切换分支:git checkout –b name
删除分支:git branch –d name
添加远程库
现在我们已经在本地创建了一个Git仓库了,
接下来登陆GitHub,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
在Repository name填入 learngit 其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
如上图所示我已经把本地仓库的内容推送到了GitHub上了,创建完以后应该是一个空的仓库。接着可以在本地learngit仓库下运行命令:
$ git diff HEAD -- readme.txt diff --git a/readme.txt b/readme.txtindex 76d770f..a9c5755 100644--- a/readme.txt+++ b/readme.txt@@ -1,4 +1,4 @@ Git is a distributed version control system. Git is free software distributed under the GPL. Git has a mutable index called stage.-Git tracks changes.+Git tracks changes of files.
添加后,远程库的名字就是 origin ,这是Git默认的叫法。
$ git push -u origin master Counting objects: 20, done.Delta compression using up to 4 threads.Compressing objects: 100% (15/15), done.Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.Total 20 (delta 5), reused 0 (delta 0)remote: Resolving deltas: 100% (5/5), done.To github.com:RFHzhj/learngit.git * [new branch] master -> masterBranch 'master' set up to track remote branch 'master' from 'origin'.
使用 git push 命令,就是把当前分支 master 推送到远程。
推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样:
只要本地作了提交,就可以通过命令git push origin master把本地 master 分支的最新修改推送至远程的github。通过git pull origin master b把远程最新的修改更新到本地master分支。
到这,GIT的常规操作就学完了。后面也就是孰能生巧的事了。
实际去公司工作的时候,通常已经有了远程库,只要把远程库拉下来,建立自己的分支就可以进行开发了。