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
  • 提交仓库的改动

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

  • 比较分支
    我们先创建分支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(-)

  • 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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值