Git本地库操作及分支处理

2021-7-24 git工具

Git本地库操作及分支处理,从视频和实战中总结

git命令行中选中即复制,粘贴为shift+ins,清屏为ctrl+l,查看当前文件ll,查看当前所有文件(包括隐藏文件):ll -lA,查看文件内容为cat 文件名,创建新文件为mkdir 文件名

# 本地库初始化

右键点击Git Bath Here输入初始化命令:

git init

//执行结果:初始化了一个空的git仓库
$ git init
Initialized empty Git repository in D:/programming/git/test/.git/

//.git文件夹的内容
$ ll .git/
total 7
-rw-r--r-- 1 huawei 197121  23 Jul 16 10:24 HEAD
-rw-r--r-- 1 huawei 197121 130 Jul 16 10:24 config
-rw-r--r-- 1 huawei 197121  73 Jul 16 10:24 description
drwxr-xr-x 1 huawei 197121   0 Jul 16 10:24 hooks/
drwxr-xr-x 1 huawei 197121   0 Jul 16 10:24 info/
drwxr-xr-x 1 huawei 197121   0 Jul 16 10:24 objects/
drwxr-xr-x 1 huawei 197121   0 Jul 16 10:24 refs/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

  1. 可以通过mkdir 文件名来创建新文件
  2. .git是隐藏文件,如果ls -lA命令可以查看
  3. 通过ll命令查看当前目录下的文件
  4. .git目录存放的是本地库相关的子目录和文件,不要删除,也不要修改

# 设置签名

  1. 形式:
    • 用户名:tom
    • Email:goodMorning@atguigu.com
  2. 作用:区分不同开发人员身份
  3. 命令:
    • 项目级别/仓库级别:仅在当前本地库范围有效

      git config user.name tom_pro
      git config user.email goodMorning_pro@atguigu.com
      //信息保存位置:./.git/config文件(可通过`cat 文件`来查看) 
      
      1
      2
      3
    • 系统用户级别:登录当前操作系统的用户范围

      git config --global user.name tom
      git config --global user.email goodMorning@atguigu.com
      //信息保存位置:~/.gitconfig文件
      
      1
      2
      3
    • 二者都没有是不允许的,后面执行git命令会报错,且重复设置可覆盖

  4. 查看签名:
    • 项目级别:

      ll .git #可看到.git目录中有config文件
      cat .git/config #查看文件内容,设置了签名可看见[user]项
      
      1
      2
    • 系统级别:

      cd ~ #回到系统目录
      pwd #查看系统目录的路径
      ll -lA #配置了系统签名可看见系统目录有.gitconfig文件
      cat .gitconfig
      
      1
      2
      3
      4

注:这里设置的签名和登录代码托管中心的账号、密码没有任何关系

# 基本操作

  1. 新建一个文件
vim 文件名
1
  • 随便输入文件内容
  • 内容输完后,按Esc,在最下面输入:wq退出编辑界面
  1. 查看状态
    • 查看工作区、暂存区状态
git status

//在没有添加和提交文件前:
$ git status
On branch master//在master分支上
No commits yet//本地库没有提交的东西
nothing to commit (create/copy files and use "git add" to track)//暂存区没有提交的东西

//在添加了文件,但没有git add提交前:
$ git status
On branch master
No commits yet
Untracked files:
  (use "git add <file>..." to include in what will be committed)//文件没有被git追踪,希望执行git add
        good.txt
nothing added to commit but untracked files present (use "git add" to track)

//提交到暂存区之后:
$ git status
On branch master
No commits yet
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)//撤销提交操作,只是撤销,不会删除在工作区的good.txt文件
        new file:   good.txt

//提交到本地库之后:
$ git status
On branch master
nothing to commit, working tree clean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  1. 添加操作
    • 将工作区的“新建/修改”添加到暂存区
    • 如果是修改文件,可以不再git add,直接git commit
    • 添加到暂存区是可以撤回的,但提交到本地库就没有撤回操作了
//添加到暂存区
git add 文件名
//将所有文件添加到暂存区
git add .

git rm --cached 文件名
//从暂存区移除
1
2
3
4
5
6
7
  1. 提交操作
    • 将暂存区的内容提交到本地库
    • 如果提交暂存区的所有文件或者解决冲突时,commit后面不用加文件名
git commit 文件名

//回车后会出现vim界面,要求输入提交信息(就像代码注释一样)
//在最下面输入':set nu'可显示行号(此命令可以不用)
//按'i'进入编辑模式
//编辑后按Esc,在最下面输入:wq退出编辑界面

//执行结果:
$ git commit good.txt
warning: LF will be replaced by CRLF in good.txt.
[master (root-commit) f8cc15d] my first commit//将第一次提交作为根提交
 1 file changed, 3 insertions(+)//一个文件修改,3行
 create mode 100644 good.txt

 git commit -m "提交信息" 文件名
//这样就不用进文本编辑器了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  1. 版本的前进和后退

操作实质就是移动HEAD指针,它指向当前版本。

查看版本的历史记录:

git log
git log --pretty=oneline
//当版本信息过多时,可以使用第二条命令,让每条信息只显示一行(空格向下翻页,b向上翻页,q退出)
git log --oneline//日志信息只显示一部分
git reflog//显示出HEAD指针要移动的次数

//执行结果
$ git log
commit f8cc15dbf75e66bf07e96bfe7d3675ca737b9dbd (HEAD -> master)//中间的数值是哈希值(索引值),右边的HEAD指针指向当前的版本,版本的前进后退就是通过改变HEAD指针的指向来实现的
Author: tom <goodMorning@qq.com>
Date:   Fri Jul 16 11:28:31 2021 +0800

    my first commit
    
$ git log --pretty=oneline
c5eeeac23ab7a74da4c5baa7da154254db8621a5 (HEAD -> master) add twice
ef3e37de49a24c21249ab60151f0f00716de3df1 third
e52284f6df167e21759573bd2e986c69c595118d second
f8cc15dbf75e66bf07e96bfe7d3675ca737b9dbd my first commit

$ git log --oneline
c5eeeac (HEAD -> master) add twice
ef3e37d third
e52284f second
f8cc15d my first commit

$ git reflog
c5eeeac (HEAD -> master) HEAD@{0}: commit: add twice
ef3e37d HEAD@{1}: commit: third
e52284f HEAD@{2}: commit: second
f8cc15d HEAD@{3}: commit (initial): my first commit//{}里面是HEAD指针要移动的步数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

操作方法:

  • 基于索引值操作(不用考虑前进还是后退,只要选中你想要的版本就可以了)
git reset --hard hash值//该索引为想回退版本的哈希值

huawei@LAPTOP-E998T2VO MINGW64 /d/programming/git/test (master)
$ git reset --hard ef3e37d
HEAD is now at ef3e37d third

huawei@LAPTOP-E998T2VO MINGW64 /d/programming/git/test (master)
$ git reflog
ef3e37d (HEAD -> master) HEAD@{0}: reset: moving to ef3e37d//当前指针指向位置
//版本列表及指针位置
c5eeeac HEAD@{1}: commit: add twice
ef3e37d (HEAD -> master) HEAD@{2}: commit: third
e52284f HEAD@{3}: commit: second
f8cc15d HEAD@{4}: commit (initial): my first commit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • 使用^符号(只能后退)
git reset --hard HEAD^//n个^就退n步
1
  • 使用~符号(只能后退)
git reset --hard HEAD~n//n表示后退n步
1
  1. reset命令的三个参数对比
    1. --soft
      • 仅仅在本地库移动HEAD指针
      • 相当于commit的撤销操作
    2. --mixed
      • 在本地库移动HEAD指针
      • 重置暂存区
      • 相当于add的撤销操作
    3. --hard
      • 在本地库移动HEAD指针
      • 重置暂存区
      • 重置工作区
  2. 永久删除文件并找回

从本地库中删除文件:

rm aaa.txtgit add aaa.txtgit commit -m "delete aaa.txt" aaa.txt
//提交删除操作
1
2

找回文件:

  • 只要提交到了本地库,都会留下记录,可以根据记录找回
  • 通过版本前进后退操作根据hash值找回文件
  1. 比较文件
//修改文件后将工作区中文件和暂存区的文件进行比较
git diff apple.txt

//执行结果
$ git diff apple.txt
diff --git a/apple.txt b/apple.txt
index 4c479de..67a8a27 100644
--- a/apple.txt
+++ b/apple.txt
@@ -1 +1,2 @@
 apple
+git diff
//+表示修改了的,-表示删除了的

//如果将暂存区的文件和本地库的文件比较就会显示区别
git diff HEAD apple.txt

//和某个历史版本比较
git diff HEAD^ apple.txt

//如果不加文件参数,则会列出当前工作区中所有文件的比较
git diff
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 分支管理

分支:在版本控制过程中,使用多条线同时推进多个任务。

foo
  • 可以同时并行推进多个功能开发,提高开发效率
  • 各个分支彼此独立,互不影响,失败的分支删除重新开始即可

# 分支操作

  1. 创建分支
git branch 分支名
1
  1. 查看所有分支
git branch -v
1
  1. 切换分支
git checkout 分支名
1
  1. 合并分支
    • 切换到接受修改的分支上(被合并,增加新内容)
    • 执行merge命令
git checkout mastergit merge hot-fix
//以上命令就是将hot-fix合并到master
1
2
  1. 解决冲突

如果两个分支修改的是同一个文件的同一位置就会产生冲突。

//产生冲突
$ git merge hot-fix
Auto-merging good.txt
CONFLICT (content): Merge conflict in good.txt
Automatic merge failed; fix conflicts and then commit the result.

$ cat good.txt
aaaaaaaa
bbbbbbbb
cccccccc
dddddddd
<<<<<<< HEAD //当前分支的内容
eeeeeeee edit by master
======= //分割冲突部分
eeeeeeee edit by hot-fix
>>>>>>> hot-fix
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

冲突的解决:

  1. 编辑文件,删除特殊符号
  2. 把文件修改到满意的程度,保存退出
  3. git add [文件名]
  4. git commit -m "日志信息"(后面不能加文件名,否则会报错)