首先放个图,这就是大名鼎鼎的git:
git是现在世界上最先进的分布式版本控制系统......吹捧它的话咱就不说了。
目录
git主要就是用来版本控制,也使项目的分工合作更简单。
安装Git
在Linux上安装Git
打开terminal,输入git
,看看系统有没有安装Git:
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
看得懂上面英语的话,就会知道你的系统没有安装git,看不懂就百度一下哈。
如果你用Debian或Ubuntu,使用 sudo apt-get install git
就可以直接完成Git的安装。
还可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:./config
,make
,sudo make install
这几个命令安装就好了。
在Mac OS X上安装Git
Mac有两种安装Git的方法:
一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。
第二种方法更简单,也是推荐的方法,就是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
Xcode是Apple官方IDE,功能非常强大,是开发Mac和iOS App的必选装备,而且是免费的!
在Windows上安装Git
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
也可以随便进入一个文件夹,鼠标右击,在出现的菜单中,如果有类似Git Bash的命令,也说明安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
创建版本库
版本库又名仓库,英文名repository,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
初始化git版本库
1)创建一个空目录 mkdir learngit
2)进入新创建的目录 cd learngit/
3)初始化一个Git版本库 git init 会告诉你初始化成功一个空的repository
4)在目录learngit可以看到.git文件,没事就不要动这个文件,不然会破坏版本库。
如果没有.git文件,那它就是隐藏了,使用 ls -ah 命令查看
wfcdeiMac:PycharmProjects wfc$ mkdir learngit
wfcdeiMac:PycharmProjects wfc$ cd learngit/
wfcdeiMac:learngit wfc$ pwd
/Users/wfc/PycharmProjects/learngit
wfcdeiMac:learngit wfc$ git init
Initialized empty Git repository in /Users/wfc/PycharmProjects/learngit/.git/
wfcdeiMac:learngit wfc$ ls -ah
. .. .DS_Store .git
这个时候就可以在 learngit 目录下添加编辑你的文件了。
一定要放到learngit
目录下(子目录也行),因为这是一个Git仓库,放到其他地方Git再厉害也找不到这个文件。
git add 和 git commit
例如新建一个 file1.txt 的文件,在文件中添加 This is the first git test.
然后在命令窗口输入 git add file1.txt 然后你就会发现没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功
再输入 git commit -m 'This is the first git test' 然后就会看到输出一大堆,读一下就会发现莫名的成功...
[master (root-commit) 65573d6] This is the first git test
....
1 file changed, 1 insertion(+)
create mode 100644 file1.txt
解释一下上面的两句代码:
git add <file> 把文件添加到仓库,可以一次添加一个文件(可以反复添加),也可以一次添加多个 git add file1,file2,...
还可以一次性添加所有文件 git add . 注意最后的 .
git commit -m <message> 把文件提交到仓库,-m
后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
添加文件到仓库只需要上面两步。
git status
接着我们修改file1.txt,添加 we modified this file. ,记得保存
然后再命令窗口输入 git status,会看到输出一大堆...
wfcdeiMac:learngit wfc$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: file1.txt
...
no changes added to commit (use "git add" and/or "git commit -a")
git status
命令可以让我们掌握仓库当前的状态,上面的输出告诉我们,file1.txt
被修改过了,但还没有准备提交的修改。
从输出我们只看到有文件被修改了,但是修改的内容并不能看出来,试一下使用 git diff file1.txt
wfcdeiMac:learngit wfc$ git diff file1.txt
diff --git a/file1.txt b/file1.txt
index 76b9c5b..eff73e2 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1 +1,2 @@
This is the first git test.
+we modified this file.
可以看到文件修改的内容也可以看到了。
使用git add 和 git commit提交文件。再使用 git status 查看一下状态
wfcdeiMac:learngit wfc$ git status
On branch master
...
nothing added to commit but untracked files present (use "git add" to track)
可以看到 nothing added to commit 表示没有要提交的文件了。
git log
在实际工作中,我们不可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。在Git中,git log
命令可以告诉我们历史记录,显示从最近到最远的提交日志:
wfcdeiMac:learngit wfc$ git log
commit c1ffafbf3ccff6d15d7ee0258b9fbe1c71129759
Author: wfc <wfc@wfcdeiMac.local>
Date: Tue Jul 17 20:29:04 2018 +0800
Modified file
commit 65573d6ef3e3e76f5608ce5abb9e90afd4cf0ea3
Author: wfc <wfc@wfcdeiMac.local>
Date: Tue Jul 17 20:01:27 2018 +0800
This is the first git test
可以看到上面输出了很多信息...
如果嫌信息太长,就在命令后面添加 --pretty=oneline,会输出简要的信息
wfcdeiMac:learngit wfc$ git log --pretty=oneline
c1ffafbf3ccff6d15d7ee0258b9fbe1c71129759 Modified file
65573d6ef3e3e76f5608ce5abb9e90afd4cf0ea3 This is the first git test
从输出信息中我们会看到一个长串的东东 c1ffafbf3ccff6d15d7ee0258b9fbe1c71129759 这是 commit id(版本号),这个是唯一的。
这个长串有什么用呢?
可以用于版本回退。
git reset --hard
例如我们不想修改文件了,要回退到第一次提交的版本,使用 git reset --hard HEAD^
wfcdeiMac:learngit wfc$ git reset --hard HEAD^
HEAD is now at 65573d6 This is the first git test
git log 看一下:
wfcdeiMac:learngit wfc$ git log
commit 65573d6ef3e3e76f5608ce5abb9e90afd4cf0ea3
Author: wfc <wfc@wfcdeiMac.local>
Date: Tue Jul 17 20:01:27 2018 +0800
This is the first git test
修改后的那个版本没啦...
git reset --hard HEAD^ 是回退到上一个版本,回退到上上一个版本就用 git reset --hard HEAD^^, ....
要回退到前100个版本那还不得累死啊,git当然不会这么智障。这时我们可以找到要回退到的commit id,
然后输入 git reset --hard <commit id> 就可以了。
回退之后,后悔了怎么办,那就再回退回去。。。前提是你能找到版本号。
wfcdeiMac:learngit wfc$ git reset --hard c1ffaf 版本号不必输入完整
HEAD is now at c1ffafb Modified file
git log 一下,会发现我胡汉三又回来了。。。
如果忘记版本号怎么办???那就试试 git reflog
git reflog
git reflog
用来记录你的每一次命令
wfcdeiMac:learngit wfc$ git reflog
c1ffafb HEAD@{0}: reset: moving to c1ffaf
65573d6 HEAD@{1}: reset: moving to HEAD^
c1ffafb HEAD@{2}: commit: Modified file
65573d6 HEAD@{3}: commit (initial): This is the first git test
git checkout -- <file>
场景一:
当你在修改 file1.txt 之后,还并未使用 git add 添加到暂存区之前,发现修改错了,想要撤销,
就可以使用 git checkout -- <file>命令,该命令意思就是把 file1.txt
文件在工作区的修改全部撤销
例如下面的例子,你在文件中添加了SB,保存之后,后悔了,想不留痕迹的撤销掉,就使用 这个命令吧...
wfcdeiMac:learngit wfc$ cat file1.txt
This is the first git test.
we modified this file.
Modified...
SB
使用 git status 看一下文件状态,已经修改,还没有添加到暂存区 https://blog.csdn.net/qq_42413820/article/details/81088834
wfcdeiMac:learngit wfc$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: file1.txt
no changes added to commit (use "git add" and/or "git commit -a")
使用 git checkout -- file1.txt 撤销修改
wfcdeiMac:learngit wfc$ git checkout -- file1.txt
看一下执行命令后的文件,发现已经撤销了...
wfcdeiMac:learngit wfc$ git status
On branch master
nothing to commit, working tree clean
wfcdeiMac:learngit wfc$ cat file1.txt
This is the first git test.
we modified this file.
Modified...
上面的命令不要忘记了 -- 这两个横线,不然会变成切换分支的命令 https://blog.csdn.net/qq_42413820/article/details/81094127
场景二:
如果你是 git add 之后, git commit 之前发现这个问题没想要撤销怎么办呢???办法总会有的...
1) 首先使用 git reset HEAD <file> 命令把暂存区的修改撤销掉(unstage),重新放回工作区
wfcdeiMac:learngit wfc$ git reset HEAD file1.txt
Unstaged changes after reset:
M file1.txt
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本
2)使用 git status 发现暂存区是干净的,只有工作区还有未添加的 file1.txt 文件
wfcdeiMac:learngit wfc$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: file1.txt
no changes added to commit (use "git add" and/or "git commit -a")
现在知道该怎么办了吧...
使用 git checkout -- <file> 撤销工作区的修改.... ok
场景三:
修改之后,还是用 git commit 命令提交到了版本库,就使用上面提到的版本回退吧...
git rm
当你把工作区的某个文件删除之后(假设已经提交到版本库),这个时候工作区是没有了该文件,但是版本库中还存在其最近提交的版本,如果又想把文件从版本库中删除,就使用 git rm <file> 然后再 git commit 一次,就从版本库中删除该文件了。
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本: git checkout -- <file>
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。