Git是目前世界上最先进的分布式版本控制系统(没有之一),简单点讲就是可以记录你对文件每一次的改动,而且还可以让同事协作编辑。
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
查看版本:
$ git --version
git version 2.7.4
~/.ssh/
)$ ssh-keygen
查看两个密钥文件,后缀为 .pub 的就是公钥文件,另一个没有后缀的就是私钥文件;
关联公钥到 Github 账号下
首先复制公钥文件中的内容,也就是 ssh-rsa 开头到 用户名@主机名 这段字符串(全部复制就对了);打开Setting ->SSH and GPG keys,选择new SSH key,填写title和以及将刚才的复制内容粘贴到key:
配置用户名与邮箱
### 如果想设置为全局生效,添加 --global 参数
$ git config --global user.name "你的用户名"
$ git config --global user.email "你的邮箱"
首先到远程仓库中,点击 Clone or download 按钮,选择使用 Use SSH,然后点击复制链接按钮
#命令用法:git clone "你复制的仓库链接"
$ git clone [email protected]:Jackpon/Test3.git
正克隆到 'Test3'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (3/3), 完成.
检查连接... 完成。
$ ls
Test3
clone完在你的当前目录下就有你克隆的文件(我的是Test3),接下来进入Test3,你就可以进行编辑操作了。
1、 创建或修改文件
2、 使用git add命令添加新创建或修改的文件到本地的缓存区(Index)
3、 使用git commit命令提交到本地代码库
4、 使用git push命令将本地代码库同步到远端代码库
jackpon@jackpon:~/MyGit_repository$ cd Test3
jackpon@jackpon:~/MyGit_repository/Test3$ ls
README.md
jackpon@jackpon:~/MyGit_repository/Test3$ cat README.md
# Test3
add a repository -Test3
//$ git add filename
jackpon@jackpon:~/MyGit_repository/Test3$ echo 'file1'>file1
jackpon@jackpon:~/MyGit_repository/Test3$ git add file1
jackpon@jackpon:~/MyGit_repository/Test3$ ls
file1 README.md
jackpon@jackpon:~/MyGit_repository/Test3$ git rm README.md
rm 'README.md'
jackpon@jackpon:~/MyGit_repository/Test3$ git reset --hard HEAD
HEAD 现在位于 953adc8 Initial commit
jackpon@jackpon:~/MyGit_repository/Test3$ ls
README.md
jackpon@jackpon:~/MyGit_repository/Test3$ cat README.md
# Test3
add a repository -Test3
在仓库的每一次改动操作之后,推送同步到远程仓库之前,都需要对这一次或这一批次的操作做提交,命令为 git commit,用法是 git commit -m “你的提交备注”,只有做好提交动作,才可以开始推送改动到远程仓库同步
jackpon@jackpon:~/MyGit_repository/Test3$ git commit -m 'add file1'
[master da2439b] add file1
1 file changed, 1 insertion(+)
create mode 100644 file1
当我们提交了仓库的改动后,就可以开始推送改动的内容到远程仓库了,可以使用 git push 命令来推送,用法是 git push [-u] origin <分支名>,分支名默认是 master 具体步骤如下
第一次推送改动可以使用 -u 参数,使用之后会绑定你这一次的仓库分支名,这样的话下一次推送就不需要加上分支名了,如图
jackpon@jackpon:~/MyGit_repository/Test3$ git push
对象计数中: 3, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (3/3), 274 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:Jackpon/Test3.git
953adc8..da2439b master -> master
操作完后,在你的github上的Test3中就有file1。
$ git pull
Git的分支可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线。分支的作用体现在多人协作开发中,比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,而其他同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。
1、 分支
// 创建一个新的叫 Mybranch的分支:
$ git branch Mybranch
//查看现在处于哪个分支:
$ git branch
Mybranch
* master
master分支是Git系统默认创建的主分支。星号标识了你当工作在哪个分支下,输入git checkout 分支名
可以切换到其他分支:
jackpon@jackpon:~/MyGit_repository/Test3$ git checkout Mybranch
切换到分支 'Mybranch'
jackpon@jackpon:~/MyGit_repository/Test3$ ls
file1 README.md
我们来修改下Mybranch分支下的file1成‘修改-file1’,为待会的合并做准备
jackpon@jackpon:~/MyGit_repository/Test3$ vim file1
jackpon@jackpon:~/MyGit_repository/Test3$ git status
位于分支 Mybranch
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: file1
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
jackpon@jackpon:~/MyGit_repository/Test3$ git add file1
jackpon@jackpon:~/MyGit_repository/Test3$ git commit -m 'Mybranch:file1'
[Mybranch e10ee96] Mybranch:file1
1 file changed, 1 insertion(+), 1 deletion(-)
2、 合并
跳转回master并对file1修改成‘master:file1’
jackpon@jackpon:~/MyGit_repository/Test3$ vim file1
jackpon@jackpon:~/MyGit_repository/Test3$ git checkout master
M file1
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
jackpon@jackpon:~/MyGit_repository/Test3$ cat file1
file1
jackpon@jackpon:~/MyGit_repository/Test3$ vim file1
jackpon@jackpon:~/MyGit_repository/Test3$ git add file1
jackpon@jackpon:~/MyGit_repository/Test3$ git commit -m 'master:file1'
[master b1730e4] master:file1
1 file changed, 1 insertion(+), 1 deletion(-)
这时,两个分支就有了各自不同的修改,分支的内容都已经不同,如何将多个分支进行合并呢?
可以通过下面的git merge命令来合并Mybranch到主线分支master:
# 切换到master分支
$ git checkout master
# 将Mybranch分支合并到master
$ git merge -m 'merge Mybranch branch' Mybranch
jackpon@jackpon:~/MyGit_repository/Test3$ cat file1
<<<<<<< HEAD
master:file1
=======
修改-file1
>>>>>>> Mybranch
可以看到冲突的内容被加到file1中了,我们使用vim编辑这个文件,去掉git自动产生标志冲突的<<<<<<等符号后,根据需要只保留我们需要的内容后保存,然后使用git add file1和git commit命令来提交合并后的file1内容,这个过程是手动解决冲突的流程。
jackpon@jackpon:~/MyGit_repository/Test3$ vim file1
jackpon@jackpon:~/MyGit_repository/Test3$ git add file1
jackpon@jackpon:~/MyGit_repository/Test3$ git commit -m '合并file1'
[master 67493f3] 合并file1
jackpon@jackpon:~/MyGit_repository/Test3$ cat file1
master:file1
修改-file1
**
$ git log --graph --pretty=oneline
* 67493f39d9383ed394e3fa95e5a30dee2e2c1416 合并file1
|\
| * e10ee96d7ac0500702229347d94c9dc4ff34ef14 Mybranch:file1
* | b1730e4c8e8832e6cdd47b4be66139086fb1b458 master:file1
|/
* da2439b93eb8c7538ca037b4dab940d1a40a0452 add file1
如果你觉得你合并后的状态是一团乱麻,想把当前的修改都放弃,你可以用下面的命令回到合并之前的状态:
$ git reset --hard HEAD^
# 查看file1的内容,已经恢复到合并前的master上的文件内容
$ cat file1
当我们完成合并后,不再需要Mybranch时,可以使用下面的命令删除:
$ git branch -d Mybranch
git branch -d
只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D
$ echo "branch test">>file1
$ echo "new file2">>file2
$ git add *
$ git commit -m "update test branch"
[test 0bc3710] update test branch
2 files changed, 2 insertions(+)
create mode 100644 file2
$ git diff master test
diff --git a/file1 b/file1
index fa49b07..17059cd 100644
--- a/file1
+++ b/file1
@@ -1 +1,2 @@ //意思就是目标文件的第1行开始的2行与源文件第一行有差异
new file
+branch test //目标文件的差异就在这了
diff --git a/file2 b/file2
new file mode 100644
index 0000000..80e7991
--- /dev/null //源文件没有该文件
+++ b/file2
@@ -0,0 +1 @@
+new file2
注释:
//git diff 结果分析
---代表源文件
+++代表目标文件
-开头的行,是只出现在源文件中的行
+开头的行,是只出现在目标文件中的行
空格开头的行,是源文件和目标文件中都出现的行
差异按照差异小结进行组织,每个差异小结的第一行都是定位语句,由@@开头,@@结尾。
如果你要查看当前的工作目录与另外一个分支的差别,你可以用下面的命令执行:
$ git diff test
你也以加上路径限定符,来只比较某一个文件或目录:
$ git diff test file1
–stat参数可以统计一下有哪些文件被改动,有多少行被改动:
$ git diff test --stat
file1 | 1 -
file2 | 1 -
2 files changed, 2 deletions(-)
$ git log
//具体使用查阅help
$ git help log
现在我们对项目做些修改:
jackpon@jackpon:~/MyGit_repository$ cd gitproject/
jackpon@jackpon:~/MyGit_repository/gitproject$ echo "new line" >> README.md
jackpon@jackpon:~/MyGit_repository/gitproject$ echo "new file" >> file1
使用git status查看当前修改的状态:
jackpon@jackpon:~/MyGit_repository/gitproject$ git status
位于分支 master
您的分支与上游分支 'origin/master' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: README.md
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
file1
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
可以看到一个文件修改了,另外一个文件添加了。如何查看修改的文件内容呢,那就需要使用git diff命令。git diff命令的作用是比较修改的或提交的文件内容。
jackpon@jackpon:~/MyGit_repository/gitproject$ git diff
diff --git a/README.md b/README.md
index 21781dd..410e719 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
gitproject
==========
+new line
命令输出当前工作目录中修改的内容,并不包含新加文件,请注意这些内容还没有添加到本地缓存区。
将修改内容添加到本地缓存区,通配符可以把当前目录下所有修改的新增的文件都自动添加:
$ git add *
再执行git diff会发现没有任何内容输出,说明当前目录的修改都被添加到了缓存区,如何查看缓存区内与上次提交之间的差别呢?需要使用–cached参数:
jackpon@jackpon:~/MyGit_repository/gitproject$ git diff --cached
diff --git a/README.md b/README.md
index 21781dd..410e719 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
gitproject
==========
+new line
diff --git a/file1 b/file1
new file mode 100644
index 0000000..fa49b07
--- /dev/null
+++ b/file1
@@ -0,0 +1 @@
+new file
可以看到输出中已经包含了新加文件的内容,因为file1已经添加到了缓存区。
最后我们提交代码再执行git diff --cached
:
$ git commit -m 'update code'
[master 96b0176] update code
2 files changed, 2 insertions(+)
create mode 100644 file1
可以发现什么都没有输出。