1、 安装git
2、创建版本仓库
3、添加文件到 git仓库
4、修改文件、版本回退、撤销修改、删除文件
5、工作区和暂存区
6、添加远程库
7、从远程库克隆
8、创建分支 合并分支
9、向github上传文件遇到的问题
1、安装git
输入 git
查看是否已经安装了git
$ git
安装 git
$ sudo apt-get install git
2、创建版本仓库 repository
- 先创建一个目录,我创建的目录名字为 learngit
$ mkdir learngit
$ cd learngit
$ pwd //命令 pwd 是用于显示当前目录的
- 通过
git init
命令把这个目录变成Git可以管理的仓库
$ git init
Initialized empty Git repository in F:/gitlearn/.git/
这样一个空的仓库就创建好了,并且在当前目录生成了一个 .git
文件,如果目中没有显示这个文件,那就是默认隐藏了,可以输入命令 ls -ah
来查看。
3、添加文件到 git仓库
- 首先在我们创建的目录中添加一个
readme.txt
文件,文件内容如下:
Git is a version control system.
Git is free software.
- 使用命令
git add
告诉git将文件添加到仓库,实际上就是把文件添加到暂存区。
添加多个文件使用命令git add -A
$ git add readme.txt
- 使用命令
git commit
告诉git,把文件提交到仓库,实际上就是把暂存区的所有内容提交到当前分支。
$ git commit -m "write a readme file"
-m
输入的是本次提交的说明.
注意: git add
可以多次重复使用,添加多个文件。git commit -m
可以一次提交多个文件
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 file"
4、修改文件
首先修改readme.txt 文件,修改内容如下:
Git is a distributed version control system.
Git is free software
运行命令git status
查看结果
$ git status
On branch master
Changes 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 //修改 :readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
git status
命令时刻可以让我们掌握仓库的状态,上面内容告诉我们,readme.txt
文件修改了,但还没有更改添加到提交。
使用命令git diff
查看我们修改了什么内容
diff --git a/readme.txt b/readme.txt
index d8036c1..ee2c1ea 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system. //修改前的
-Git is free software.
\ No newline at end of file
+Git is a distributed version control system. //修改后的
+Git is free software
\ No newline at end of file
使用命令 git add
,git commit -m
提交修改文件
$ git add readme.txt
$ git commit -m "add distributed'
提交后我们在看看仓库的状态
$ git status
On branch master
nothing to commit, working tree clean
上面内容显示没有要提交的修改,且工作目录是干净的。
5、版本回退
命令git log
可以显示从最近到最远的提交日志,这样就知道之前我们都修改了什么内容。
$ git log
commit 8be8aaec4ea8b32fc1f6e2be4651143687296e95 (HEAD -> master)
Author: zhao-bi-han <[email protected]>
Date: Sat Jul 22 11:04:33 2017 +0800
add distributed
commit 59097a95b13d0bfb290e5a03d62b9c5ae01d4a4f
Author: zhao-bi-han <[email protected]>
Date: Sat Jul 22 10:30:35 2017 +0800
write a readme file
如果嫌信息输出的太多,可以加上参数 --pretty=oneline
$ git log --pretty=oneline
8be8aaec4ea8b32fc1f6e2be4651143687296e95 (HEAD -> master) add distributed
59097a95b13d0bfb290e5a03d62b9c5ae01d4a4f write a readme file
commit
后面一堆数字 是 commit id
版本号,使用十六进制表示而不使用数字1,2,3...表示,是防止多人开发时发生冲突。
HEAD
表示当前版本,也就是最新的提交的,上一个版本就是HEAD^
,上上个版本就是HEAD^^
,比如在往上100个版本就可以写成HEAD~100
。
现在我们退回上一个版本,使用命令 git reset --hard HEAD^
$ git reset --hard HEAD^
HEAD is now at 59097a9 write a readme file
查看readme.txt文件,内容已经是上一个版本的内容了。
$ cat readme.txt
Git is a version control system.
Git is free software.
当然我还可以在回到之前的版本,在这之前我们先看看仓库的状态
$ git log
commit 59097a95b13d0bfb290e5a03d62b9c5ae01d4a4f (HEAD -> master)
Author: zhao-bi-han <[email protected]>
Date: Sat Jul 22 10:30:35 2017 +0800
write a readme file
我们发现已经没有之前的那个版本了,要想回到之前的版本,只要上面的命令行窗口还没有被关掉,我们就可以查找我们写过的命令,然后找到我们要回去的那个版本的 commit id
。
$ git reset --hard 8be8aaec4ea8b32
HEAD is now at 8be8aae add distributed
commit id
版本号没必要写全,写上前几位就可以啦,git会自动去找。现在我们再来查看readme.txt文件
$ cat readme.txt
Git is a distributed version control system.
Git is free software
如果我们把命令行窗口关闭了,怎么回到之前的版本呢?Git有一条命令git reflog
用来记录你的每一次命令。
$ git reflog
8be8aae (HEAD -> master) HEAD@{0}: reset: moving to 8be8aaec4ea8b32
59097a9 HEAD@{1}: reset: moving to HEAD^
8be8aae (HEAD -> master) HEAD@{2}: commit: add distributed
59097a9 HEAD@{3}: commit (initial): write a readme file
这样我们就可以找到commit id
了。
6、工作区和暂存区
- 工作区
是你在电脑里能看到的目录,比如我的gitlearn文件夹就是一个工作区。 - 暂存区
stage
就是暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master的一个指针叫HEAD
。
使用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
使用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
执行命令git add
后暂存区状态变化
执行命令git commit
后暂存区状态变化
7、撤销修改
- 撤销工作区的修改
比如我们修改了readme.txt
文件,向该文件添加了一行,内容如下:
$ cat readme.txt
Git is a distributed version control system.
Git is free software
Add a row
问题来了,在把他添加到暂存区之前,我们又想把我们添加的一行去掉,我们可以执行命令git checkout -- file
,该命令可以丢弃工作区的修改,有两种情况:第一种文件修改后还没有放到暂存区,撤销修改就会回到和版本库一模一样。第二种文件修改后放到了暂存区,然后文件又做了修改,在,撤销修改就回到添加到暂存区后的状态。
$ git checkout -- readme.txt
查看此时的readme.txt
文件内容,回到了我们修改之前。
$ cat readme.txt
Git is a distributed version control system.
Git is free software
- 撤销暂存区的修改
撤销之前我们先查看一下仓库的状态
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: readme.txt
用命令git reset HEAD file
可以把暂存区的修改撤销掉(unstage),重新放回工作区。
$ git reset HEAD readme.txt
Unstaged changes after reset:
M readme.txt
在查看仓库状态,发现暂存区是干净的,工作区有修改。
$ git status
On branch master
Changes 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 checkout -- readme.txt
$ git status
On branch master
nothing to commit, working tree clean
8、删除文件
我们现在目录中添加一个test.txt
文件,并添加提交到git仓库
$ touch test.txt
$ git add test.txt
$ git commit -m "add a file"
[master 73a88f8] add a file
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test.txt
从版本库中删除文件。使用命令git rm file
,并且git commit
。
$ git rm test.txt
rm 'test.txt'
$ git commit -m "delete a file"
[master e62a181] delete a file
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 test.txt
如果我们使用命令rm file
将文件错误删除想恢复,我们就使用命令git checkout -- file
$ git checkout -- test.txt
$ ls
readme.txt test.txt
删除文件夹 使用命令git rm folder -r -f
9、添加远程库
- 先在github上创建一个仓库
learngit
- 我们根据GitHub的提示,在本地的gitlearn仓库下运行命令,
origin
是远程库的名字,git的默认叫法。
$ git remote add origin https://github.com/zhao-bi-han/learngit.git
- 把本地库的所有内容推送到远程库上
$ git push -u origin master
Counting objects: 11, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (11/11), 965 bytes | 0 bytes/s, done.
Total 11 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), done.
To https://github.com/zhao-bi-han/learngit.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master
推送到远程。
我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来。
- 之后只要本地做了提交就可以通过以下命令,把本地
master
分支的最新修改推送至GitHub。
git push origin master
当我们想删除github的上文件时,执行以下命令:
$ git rm new -r -f //这里删除的是new文件夹
$ git commit -m "deletet new"
[master 2beb2e0] deletet new
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 new/index.txt
$ git push origin master //提交分支
10、从远程库克隆
- 先在github中创建一个仓库git,并添加readme.md文件
- 用命令
git clone
克隆一个本地库
$ git clone https://github.com/zhao-bi-han/git.git
Cloning into 'git'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
切换到git目录,查看git下的文件会有一个readme.md文件
$ cd git
$ ls
README.md
11、创建分支 合并分支
每次提交master
分支都会向前移动一步,这样,随着你不断提交,master
分支的线也越来越长。
当我们创建新的分支,例如
dev
时,Git新建了一个指针叫
dev
,指向
master
相同的提交,再把
HEAD
指向
dev
,就表示当前分支在
dev
上。
从现在开始,对工作区的修改和提交就是针对
dev
分支了,比如新提交一次后,
dev
指针往前移动一步,而master指针不变。
假如我们在
dev
上的工作完成了,就可以把
dev
合并到
master
上。
看看命令是如何实现的,首先创建一个分支
dev
,并切换到
dev
分支。
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
git branch
命令查看分支,*
表示当前分支
$ git branch
*dev
master
接下来,我们修改一下readme.txt文件,添加一行。
$ cat readme.txt
Git is a distributed version control system.
Git is free software
Add a row
然后提交
$ git add readme.txt
$ git commit -m "add"
[dev ce65b6f] add
1 file changed, 2 insertions(+), 1 deletion(-)
现在,dev
分支的工作完成,我们就可以切换回master
分支。
$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
现在,我们把dev
分支的工作成果合并到master
分支上。
$ git merge dev
Updating f69afe5..ce65b6f
Fast-forward
readme.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
删除dev
分支
$ git branch -d dev
Deleted branch dev (was ce65b6f).
查看分支
$ git branch
*master
12、向github上传文件遇到的问题
上传文件遇到以下问题
问题的原因:github上的文件跟本地文件不同步
问题解决:通过如下命令进行代码合并
git pull --rebase origin master
,再上传文件执行命令
git push origin master。