Git的基本操作、分支操作、更改提交操作

鳄鱼君

发表文章数:642

热门标签

, ,

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python » Git的基本操作、分支操作、更改提交操作

想要使用Git进行版本管理,必须先初始化仓库。

常用操作

1.git init——初始化仓库

Git是使用git init命令进行初始化的。建立一个目录并初始化仓库。

$ mkdir git-tutorial
$ cd git-tutorial
$ git init
Initialized empty Git repository in ...

如果初始化成功,执行了git init命令的目录下就会生成.git目录。这个.git目录里存储着管理当前目录内容所需的仓库数据。

在Git中,我们将这个目录的内容称为“附属于该仓库的工作树”。文件的编辑等操作在工作树中进行,然后记录到仓库中,以此管理文件的历史快照。如果想将文件恢复到原先的状态,可以从仓库中调取之前的快照,在工作树中打开。开发者可以通过这种方式获取以往的文件。具体操作指令我们将在后面详细解说。

2.git status——查看仓库的状态

git status命令用于显示Git仓库的状态。工作树和仓库在被操作的过程中,状态会不断发生变化。在Git操作过程中时常用git status命令查看当前状态

$ git status
On branch master  // master分支下

Initial commit

nothing to commit (create/copy files and use "git add" to track)  // 无需提交

没有可提交的内容,就是说当前我们建立的这个仓库中还没有记录任何文件的任何状态。建立README.md文件作为管理对象,为第一次提交做前期准备。

$ touch README.md
$ git status

On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        README.md

nothing added to commit but untracked files present (use "git add" to track)

在Untracked files中显示了README.md文件。只要对Git的工作树或仓库进行操作,git status命令的显示结果就会发生变化。
3.git add——向暂存区中添加文件

如果只是用Git仓库的工作树创建了文件,那么该文件并不会被记入Git仓库的版本管理对象当中。因此我们用git status命令查看README.md文件时,它会显示在Untracked files里。让文件成为Git仓库的管理对象,需要用git add命令将其加入暂存区(Stage或者Index)中。暂存区是提交之前的一个临时区域。

$ git add README.md
$ git status

On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   README.md

将README.md文件加入暂存区后,git status命令的显示结果发生了变化。
git commit——保存仓库的历史记录

git commit命令可以将当前暂存区中的文件实际保存到仓库的历史记录中。通过这些记录,就可以在工作树中复原文件。

$ git commit -m "first commit"  //-m后的参数是提交信息,对这个提交的概述
[master a881089] first commit
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 README.md

不添加-m,历史记录会更加详细。使用git log查看记录:

$ git log
commit a8810890d5c9c2cb110a3d59c42d3d06fa6005c2
Author: paopaojun <3455272613@qq.com>
Date:   Sat Jul 18 20:16:29 2020 +0800

    first commit

commit显示的就是提交的哈希值,这个我们后面会用到。

# 只显示提交信息的第一行
git log --pretty=short
# 只显示指定目录、文件的日志
git README.md
# 显示文件的改动
git log -p
# 组合使用
git log -p README.md

git diff——查看更改前后的差别
向README.md中添加点内容:

vi README.md
# hello eyujun

$ git diff
diff --git a/README.md b/README.md
index e69de29..515c96c 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,4 @@
+# hello eyujun
+
+
+

+表示新添加的行;-表示被删除的行,我多加了几个回车,所以有呢么多加号。使用git add 将README.md添加到暂存区,然后使用git diff HEAD查看最新提交的差别,这里还是一样的:

$ git add README.md
$ git diff HEAD
diff --git a/README.md b/README.md
index e69de29..515c96c 100644
--- a/README.md
+++ b/README.md
@@ -0,0 +1,4 @@
+# hello eyujun
+
+
+

执行git commit之前,先执行git diff HEAD查看本次提交跟上次提交有什么差别。HEAD指向当前分支中最新一次提交的指针。确认两次提交之间没有差别,就可以执行git commit:

$ git commit -m 'add content'
[master ce1ebd7] add content
 1 file changed, 4 insertions(+)

$ git log  //查看一下日志

分支操作

不同分支中,可以同时进行完全不同的作业
git branch——显示分支

$ git branch
* master  // *当前所在分支,在本地仓库只存在master一个分支

git checkout -b——创建、切换分支

$ git checkout -b one   //创建one分支
Switched to a new branch 'one'

//或者执行
git branch one
git checkout one

$ git branch
  master
* one

现在处于one分支下,现在执行git add就会提交到one分支下,不断对一个分支进行提交,叫做培育分支。我们修改README.md文件:

$ vi README.md

# hello eyujun
--one   

添加一行,然后进行提交

$ git add README.md
$ git commit -m 'add one'
[one 3dc227a] add one
 1 file changed, 1 insertion(+), 3 deletions(-)

现在我们已经将修改后的README.md添加到了one分支下,然后切换到master分支下:

$ git checkout master
Switched to branch 'master'

$ cat README.md
# hello eyujun

查看README.md发现没有变化,这里不要考虑上面的空行。切换到one分支:

$ git checkout -
Switched to branch 'one'

特性分支:one;主干分支:master
我们在特性分支one下做修改,完成之后需要合并到主干分支master中,共他人查看。
git merge——合并分支
现在假设完成了one分支,要想将它合并到主干分支master上:

$ git checkout -
Switched to branch 'master'

# --no-ff记录下本次分支合并
$ git merge --no-ff one   //随后编辑器会启动,录入合并的信息,保存关闭即可

Merge branch 'one'

# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.

// 关闭之后就会出现下面的提示
Merge made by the 'recursive' strategy.
 README.md | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

git log –graph——以图表形式查看分支

$ git log --graph

git reset——回溯历史版本

创建two分支,回溯到创建one分支前。这里需要使用git reset –hard命令,还有哈希值。前面我们在one分支下执行的是$ git commit -m ‘add one’命令,所以我们查看一下日志,找到哈希值:

$ git log -p README.md
commit 3dc227aa360909bcf5604efa6dbd63a659aa2d51
Author: paopaojun <3455272613@qq.com>
Date:   Sat Jul 18 20:41:47 2020 +0800

    add one
...

// 回溯到one创建之前的状态
$ git reset --hard 3dc227aa360909bcf5604efa6dbd63a659aa2d51
HEAD is now at 3dc227a add one

// 创建two分支
$ git checkout -b two
vi README.md
# hello
--one
--two

//提交
$ git add README.md
$ git commit -m 'add two'

推进至one分支合并后的状态。首先执行git reflog命令,查看当前仓库执行过的操作日志:

$ git reflog
12b4c9d HEAD@{0}: commit: add two
3dc227a HEAD@{1}: checkout: moving from three to two
3dc227a HEAD@{2}: checkout: moving from two to three
3dc227a HEAD@{3}: reset: moving to 3dc227aa360909bcf5604efa6dbd63a659aa2d51
c0e818a HEAD@{4}: checkout: moving from master to two
c0e818a HEAD@{5}: merge one: Merge made by the 'recursive' strategy.
ce1ebd7 HEAD@{6}: checkout: moving from one to master
3dc227a HEAD@{7}: checkout: moving from master to one
ce1ebd7 HEAD@{8}: checkout: moving from one to master
3dc227a HEAD@{9}: commit: add one
ce1ebd7 HEAD@{10}: checkout: moving from master to one
ce1ebd7 HEAD@{11}: commit: add content
a881089 HEAD@{12}: commit: first commit

第四行表示one分支合并后的状态,现在我们将HEAD、暂存区、工作树恢复到这个时间点:

$ git checkout master
Switched to branch 'master'

$ git reset --hard 3dc227a
HEAD is now at 3dc227a add one

第一次我们使用git reset –hard命令回到了one分支前,接着创建two分支,并做了一些提交,现在又回溯到了one分支前的状态。现在合并two分支

$ git merge --no-ff two
//如果出现冲突,需要修改冲突部分的代码,然后重新提交

git commit –amend——修改提交信息
上一次提交的信息是默认的Merge branch ‘two’,现在修改为commit two,或者你想要的内容:

$ git commit --amend   //进入编辑器修改
[master 51e2b18] commit two
 Date: Sat Jul 18 21:19:18 2020 +0800


$ git log --graph

*   commit 51e2b188b7aa4d14ff53fe62ab8021140c46caa9
|\  Merge: 3dc227a 12b4c9d
| | Author: paopaojun <3455272613@qq.com>
| | Date:   Sat Jul 18 21:19:18 2020 +0800
| |
| |     commit two
.....

git rebase -i——压缩历史

合并特性分支之前,如果发现已提交的内容中有些许拼写错误等,不妨提交一个修改,然后将这个修改包含到前一个提交之中,压缩成一个历史记录。创建three分支:

$ git checkout -b three

//修改README.md文件,故意写错
$ vi README.md
# hello eyujun
--one
--threeeee

现在使用不使用add和commit命令,使用下面的命令提交:

$ git commit -am 'add three'
[three de096ca] add three
 1 file changed, 1 insertion(+)

现在修正刚才的错误,查看修正后的差别:

$ vi README.md
# hello eyujun
--one
--three

$ git diff
diff --git a/README.md b/README.md
index 04c95e7..72f93ec 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,3 @@
 # hello eyujun
 --one
---threeeee
+--three

//提交
$ git commit -am 'add typo'

现在历史记录中会存在我们修改后提交的内容,就是add typo,如果不想再历史记录中看到,就需要更改历史:

$ git rebase -i HEAD~2  //显示两个最新历史记录

pick de096ca add three
pick 8efa037 add typo
....

将8efa037的历史记录压缩到de096ca即可,编辑修改该内容:

pick de096ca add three
fixup 8efa037 add typo

..
[detached HEAD 2a93344] add three
 Date: Sat Jul 18 21:31:15 2020 +0800
 1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/three.

保存退出即可,查看一下历史记录:

$ git log -p

这样add typo记录就从历史记录中抹去。现在完成了three分支,将它合并到master下:

$ git checkout master

$ git merge --no-ff three
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

这里出现了冲突,修改README.MD后重新提交即可:

vi README.md

# hello eyujun
--one
<<<<<<< HEAD
--two
=======
--three
>>>>>>> three

//修改为
# hello eyujun
--three
//保存退出,重新提交
$ git add README.md
$ git commit -m 'add three'

//重新合并
$ git merge --no-ff three
Already up-to-date.

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Git的基本操作、分支操作、更改提交操作》 发布于2020-07-14

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

3 + 5 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册