Git的基本操作

  • Git是什么?

Git是目前世界上最先进的分布式版本控制系统(没有之一),简单点讲就是可以记录你对文件每一次的改动,而且还可以让同事协作编辑。

  • 在Linux上安装Git
    首先可以先在终端输入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 生成公私钥,在终端输入命令,然后建议一路按enter就可以(会把密钥文件放置再默认路径~/.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 "你的邮箱"
  • 克隆仓库到本地的个人PC

首先到远程仓库中,点击 Clone or download 按钮,选择使用 Use SSH,然后点击复制链接按钮


这里写图片描述
#命令用法:git clone "你复制的仓库链接"
$ git clone git@github.com: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,你就可以进行编辑操作了。

  • git的基本流程如下

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'

  • 撤销
    要把仓库里的改动撤销回克隆下来的状态(注意,如果改动之后执行了提交就无法再撤销,只能从远程仓库重新克隆一份到本地),可以使用 git reset 命令,具体步骤如下:
    比如我们要把刚才删除的 README.md 文件给还原回来,就可以在仓库目录下,敲入 git reset --hard HEAD 来回退
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
  • 补充(版本回退):
    • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id;
    • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本;
    • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本.
  • 提交仓库的改动*

在仓库的每一次改动操作之后,推送同步到远程仓库之前,都需要对这一次或这一批次的操作做提交,命令为 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

<div class="divider"></div>

  • 分支与合并

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

  • 比较分支
    我们先创建分支test,并改变编辑test中的文件,最后比较两个分支的不同处:
$ 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(-)

<div class="divider"></div>

  • Git日志
    git log命令可以显示所有的提交(commit):
$ git log
//具体使用查阅help
$ git help log
  • 比较提交 - Git Diff

现在我们对项目做些修改:

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

可以发现什么都没有输出。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,904评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,581评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,527评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,463评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,546评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,572评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,582评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,330评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,776评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,087评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,257评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,923评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,571评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,192评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,436评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,145评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 1.git的安装 1.1 在Windows上安装Git msysgit是Windows版的Git,从https:/...
    落魂灬阅读 12,658评论 4 54
  • 1、直接克隆远程仓库的某个分支 git clone -b 远程分支名 远程仓库地址 本地文件夹名 如...
    曹轩跃阅读 632评论 0 1
  • Git 是一个以命令行为主的免费开源的分布式版本控制系统,用于敏捷高效的处理任何或大或小的项目。是Linus To...
    sunnyaxin阅读 857评论 7 6
  • 昨天有一只大黄蜂飞到我的床前,掠过我的身影,只听见你那嗡嗡作响的双翅拍出的忧桑声,黄蜂飞来兮,欲为何意也。 ...
    米澜盛若阅读 649评论 2 1
  • 【微公益】【786】【每日经典,伴您早起】【20170619孟子260】 孟子曰:“养心莫善于寡欲。其为人也寡欲,...
    北冥_鲲阅读 325评论 3 6