GIt基本操作

Git

Git 是一个 分布式版本控制系统 (Distributed Version Control System, DVCS),由 Linus Torvalds(Linux 内核创始人)于 2005 年开发,用于高效管理代码的变更历史。它广泛应用于软件开发、文档管理等领域,支持多人协作开发。

Git安装

Linux-ubuntu

安装GIt

bash 复制代码
sudo apt-get install git -y

查看Git安装的版本

bash 复制代码
git --version

GIt基本操作

创建Git本地仓库

要提前说的是,仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制,就必须先创建⼀个仓库出来。

创建⼀个 Git 本地仓库对应的命令为git init,注意命令要在⽂件⽬录下执行

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git init
已重新初始化已存在的 Git 仓库于 /home/gjw/Desktop/gitcode/.git/
gjw@gjw-virtual-machine:~/Desktop/gitcode$ 

创建仓库后,会在当前目录下创建出一个.git隐藏文件,.git目录是Git用来跟踪管理仓库的,不要手动修改这个目录里面的文件,否则GIt仓库就给破坏了.

bash 复制代码
#使用tree命令可查看文件内容
tree .git/

配置Git

安装Git后首先设置用户名称和E-mail地址

bash 复制代码
git config [--global] user.name "username"
git config [--global] user.email "email"

其中,--global选项为选择是否对本机器的所有Git仓库进行统一配置

查看配置命令

bash 复制代码
git config -l

删除对应的配置命令

bash 复制代码
git config [--global] --unset user.name
git config [--global] --unset user.email

认识工作区,暂存区,版本库

  • 工作区: 是在电脑上你要写代码或文件的目录
  • 暂存区 : 英文叫做stage或index.一般存放在.git目录下的Index文件(.git/index)中,我们把暂存区有时也叫做索引(index)
  • 版本库 : 又名仓库(repositore),工作区有一个隐藏目录.git,它不算工作区,而是Git的版本库.这个版本库里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能追踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以"还原"

下图展示了工作区,暂存区和版本库之间的关系:

  • 图中左侧为工作区,右侧为版本库。Git的版本库里存了很多东西,其中最重要的就是暂存区.
  • 在创建Git版本库时,Git会为我们自动创建一个唯一的master分支,以及指向master的一个指针叫HEAD.
  • 当对工作区修改(或新增)的文件执行git add命令时,暂存区目录树的文件索引会被更新
  • 当执行提交操作git commit时,master分支会做相应的更新,可以简单理解为暂存区的目录数才会被真正写到版本库中

由上述描述我们便得知: 通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件.必须要通过git addgit commit命令才能将文件添加到仓库中进行管理!

添加文件

在包含.git的目录下新建一个ReadMe文件,我们可以使用git add命令将文件添加到暂存区:

  • 添加一个或多个文件到暂存区: git add [file1] [file2] ...
  • 添加指定目录到暂存区,包括子目录: git add [dir]
  • 添加当前目录下的所有文件改动到暂存区: git add .

再使用git commit命令将暂存区内容添加到本地仓库中:

  • 提交暂存区全部内容到本地仓库中: git commit -m "message"
  • 提交暂存区的指定文件到仓库区: git commit [file1] [file2] ... -m "message"

注意git commit后面的-m选项,要跟上描述本次提交的message,由用户自己完成,这部分内容绝对不能省略,并要好好描述,是用来记录你的提交细节.

例如:

git commit命令执行成功后会告诉我们,3个文件被改动(就是我们新添加的三个文件),插入了零行内容(file文件为空)

可以使用git log命令,查看下历史提交记录:

该命令可以显示从最近到最远的提交日志,并且可以看到我们commit时的日志消息

commit后面跟着的一连串字符串是每次提交的commit id(版本号),用十六进制表示

查看.git文件

先看我们的.git的目录结构:


  1. index就是我们的暂存区,add后的内容都是添加到这里的
  2. HEAD就是我们的默认指向master分支的指针:
bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat .git/HEAD
ref: refs/heads/master

默认的master分支,其实就是:

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat .git/refs/heads/master
c811d57fbe6d7664aa1ce5d683c9d7fde0b391b1

其中的c811d...这个字符串,就是当前最新的commit id

  1. objects为Git的对象库,里面包含了创建的各种版本库对象及内容.当执行git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,就位于".git/objects"目录下.

我们可以使用git cat-file命令来查看版本库对象的内容:

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git cat-file -p c811d57fbe6d7664aa1ce5d683c9d7fde0b391b1
tree 15a37e9ef171cca4a5d985fccd1fcf9414b2c7cf
parent bd06097bd6c04c24d3090928c82167840da81a79
author gjw <2830335469@qq.compwd> 1745170816 +0800
committer gjw <2830335469@qq.compwd> 1745170816 +0800

add 3 files

这就是最近一次的提交

还有一行: tree 15a37e9ef171cca4a5d985fccd1fcf9414b2c7cf,用同样的方法,看看结果:

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git cat-file -p 15a37e9ef171cca4a5d985fccd1fcf9414b2c7cf
100644 blob 8d0e41234f24b6da002d962a26c2495ea16a425f	ReadMe
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391	file1
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391	file2
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391	file3

总结: 在本地的git仓库中,有几个文件或目录很特殊

  • index: 暂存区:,git add后会更新该内容
  • HEAD: 默认指向master分支的一个指针
  • refs/heads/master: 文件里保存当前master分支的最新commit id
  • objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了git维护的所有修改

修改文件

Git跟踪并管理的是修改,而非文件

此时对ReadME文件进行修改,仓库中的ReadMe和工作区的ReadMe是不同的,如何查看当前仓库的状态呢?使用git status命令查看在你上次提交之后是否对文件进行再次修改

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git restore <文件>..." 丢弃工作区的改动)
	修改:     ReadMe

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

上面的信息说明,ReadMe被修改了,但是没有完成添加与提交

使用git diff [file]命令用来显示暂存区和工作区文件的差异,显示的格式是Unix通用的diff格式

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git diff ReadMe
diff --git a/ReadMe b/ReadMe
index 8d0e412..05fe86c 100644
--- a/ReadMe
+++ b/ReadMe
@@ -1 +1,2 @@
 hello git
+hello world

版本回退

Git能够管理文件的历史版本,这也是版本控制器重要的能力.

执行git reset命令用于回退版本,可以指定退回某一次提交的版本.回退的本质是将版本库中的内容进行回退,工作区和暂存区是否回退由命令参数决定

bash 复制代码
 git reset [--soft | --mixed | --hard] [HEAD]
  • soft: 仅回退版本库
  • mixed: 默认选项,回退版本库和暂存区
  • hard: 回退版本库,暂存区和工作区

Git还提供了一个git reflog命令,用来记录本地的每一次命令

撤销修改

如果我们在我们的⼯作区写了很⻓时间代码,越写越写不下去,觉得自己写的实在是垃圾,想恢复到上⼀个版本

情况一: 对于工作区的代码,还没有add

使用git checkout -- [filename],回退到上一次addcommit的状态

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ vim ReadMe 
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat ReadMe 
hello git
hello world
xxx code
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout -- ReadMe
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat ReadMe 
hello git
hello world

情况二: 已经add,但没有commit

先使用git reset回退命令,将空白的版本库内容,回退给暂存区,此时暂存区就变为和版本库一致的内容了.之后再参照情况一的做法仅回退工作区即可

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ vim ReadMe 
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat ReadMe 
hello git
hello world
hello version2
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git add ReadMe 
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git status
位于分支 master
要提交的变更:
  (使用 "git restore --staged <文件>..." 以取消暂存)
	修改:     ReadMe

gjw@gjw-virtual-machine:~/Desktop/gitcode$ git reset HEAD ReadMe
重置后取消暂存的变更:
M	ReadMe
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git restore <文件>..." 丢弃工作区的改动)
	修改:     ReadMe

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout -- ReadMe
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git status
位于分支 master
无文件要提交,干净的工作区
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat ReadMe 
hello git
hello world

情况三: 已经add,并且也commit了

前提条件: commit之后没有push到远程仓库中.

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ vim ReadMe 
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git add ReadMe 
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git commit -m "modify ReadMe: xxx code"
[master 2663209] modify ReadMe: xxx code
 1 file changed, 1 insertion(+)
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git reset --hard HEAD^
HEAD 现在位于 cbfff40 add modify ReadMe file
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git status
位于分支 master
无文件要提交,干净的工作区
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat ReadMe 
hello git
hello world

删除文件

使用git rm [filename]命令,可简化步骤,对工作区和暂存区的内容进行删除,用户仅需再commit一次即可完成删除操作

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git rm file3
rm 'file3'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ ls
file1  file2  ReadMe
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git status
位于分支 master
要提交的变更:
  (使用 "git restore --staged <文件>..." 以取消暂存)
	删除:     file3

gjw@gjw-virtual-machine:~/Desktop/gitcode$ git commit -m "delete file3"
[master 65f8ba5] delete file3
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 file3

分支管理

理解分支

在版本回退里,已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就可以理解为是一个分支.截至到目前,只有一个时间线,在Git里,这个分支叫主分支,即master分支

再看HEAD,HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支.

每次提交,master分支都会向前移动一步,这样,随着不断提交,master分支的线也越来越长,而HEAD只要一直指向master分支即可指向当前分支,通过查看当前的版本库,理出清晰的思路

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat .git/HEAD
ref: refs/heads/master
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat .git/refs/heads/master
65f8ba5de6295fa2e39b6b5eba15531400d07284

创建分支

Git支持我们查看或创建其他分支,我们现在创建第一个分支dev,对应的命令为

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git branch
* master
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git branch dev
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git branch
  dev
* master

切换分支

使用git checkout命令即可完成切换

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout dev
切换到分支 'dev'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git branch
* dev
  master
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat .git/HEAD
ref: refs/heads/dev

切换到dev分支后修改ReadMe文件进行添加和提交,再切回master分支发现看不到修改,此时dev和master分支的提交点是不同的

合并分支

将dev上新的提交合并到master分支

使用命令git merge进行分支合并

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout master
切换到分支 'master'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git merge dev
更新 65f8ba5..6284b42
Fast-forward
 ReadMe | 1 +
 1 file changed, 1 insertion(+)
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat ReadMe 
hello git
hello world
aaa on dev branch

删除分支

合并完成后,dev分支就没有用了,就可以删除此分支,前提是当前不能处在此分支下.

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git branch
  dev
* master
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git branch -d dev
已删除分支 dev(曾为 6284b42)。
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git branch
* master

因为创建,合并和删除分支非常快,所以Git鼓励使用分支完成某个任务,合并后再删除分支,这和直接在master分支上工作效果是一样的,但过程更安全

合并冲突

实际分支合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的问题.这里使用git checkout -b dev1一步完成创建并切换新分支的动作

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout -b dev1
切换到一个新分支 'dev1'

在dev1分支下修改ReadMe文件,然后切回master分支再次修改

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ vim ReadMe 
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git add ReadMe 
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git commit -m "md ReadMe; bbb"
[dev1 b487628] md ReadMe; bbb
 1 file changed, 1 insertion(+), 1 deletion(-)
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout master
切换到分支 'master'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ vim ReadMe
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git add .
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git commit -m "md ReadMe: ccc"
[master ef5535b] md ReadMe: ccc
 1 file changed, 1 insertion(+), 1 deletion(-)

此时两分支的状态变为

这种状态下,Git只能试图把各自的修改合并起来,但这种合并可能会有冲突,我们需要手动调整冲突代码,并需要再次提交修正后的结果(一定要再次提交!)

这样就解决了合并冲突的问题

用带参数的git log可以看到分支的合并情况

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout master
切换到分支 'master'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git log --graph --abbrev-commit
*   commit 8bf96f4 (HEAD -> master)
|\  Merge: ef5535b b487628
| | Author: gjw <2830335469@qq.compwd>
| | Date:   Mon Apr 21 18:00:48 2025 +0800
| | 
| |     merge dev1
| | 
| * commit b487628 (dev1)
| | Author: gjw <2830335469@qq.compwd>
| | Date:   Mon Apr 21 17:54:52 2025 +0800
| | 
| |     md ReadMe; bbb
| | 
* | commit ef5535b
|/  Author: gjw <2830335469@qq.compwd>
|   Date:   Mon Apr 21 17:56:12 2025 +0800
|   
|       md ReadMe: ccc

分支管理策略

通常合并分支时,如果可能,Git会采用Fast forward模式.在这种模式下,删除分支后,查看分支历史时,会丢掉分支信息,看不出来最新提交到底是merge进来的还是正常提交的.

但是合并冲突时,通过解决冲突问题,会再一次进行新的提交,这样就不是Fast forward模式了,这样的好处是,从分支历史上就可以看出分支信息.例如我们已经删除了合并冲突部分创建的dev1分支,但依旧能看到master其实是由其他分支合并得到的

Git支持我们强制禁用Fast forward模式,那么就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息,以下使用--no-ff方式的git merge

首先创建并切换至新的分支dev2,修改ReadMe文件并提交

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout -b dev2
切换到一个新分支 'dev2'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ vim ReadMe 
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git add .
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git commit -m "md ReadMe"
[dev2 dd18711] md ReadMe
 1 file changed, 1 insertion(+)

切换回master分支进行合并,注意使用--no-ff参数,表示禁用Fast forward模式.禁用Fast forward模式后合并会创建一个新的commit,所以还要加上-m参数,写上描述

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout master
切换到分支 'master'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git merge --no-ff -m "merge with no-ff" dev2
Merge made by the 'ort' strategy.
 ReadMe | 1 +
 1 file changed, 1 insertion(+)
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat ReadMe
hello git
hello world
bbb on dev branch
abcd

合并后,查看分支历史

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git log --graph --abbrev-commit
*   commit 2f47329 (HEAD -> master)
|\  Merge: 8bf96f4 dd18711
| | Author: gjw <2830335469@qq.compwd>
| | Date:   Mon Apr 21 19:42:01 2025 +0800
| | 
| |     merge with no-ff
| | 

所以在合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而Fast forward模式合并就看不出来曾经做过合并

分支策略

实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活

干活都在dev分支上,也就是说dev分支是不稳定的.

BUG分支

假如我们现在正在dev2分⽀上进行开发,开发到⼀半,突然发现 master分⽀上面有 bug,需要解决。在Git中,每个 bug 都可以通过⼀个新的临时分⽀来修复,修复后,合并分⽀,然后将临时分⽀删除。

可现在dev2的代码在⼯作区中开发了⼀半,还⽆法提交,怎么办?

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout -b dev2
切换到一个新分支 'dev2'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ vim ReadMe 
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout master
M	ReadMe
切换到分支 'master'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat ReadMe 
hello git
hello world
bbb on dev branch
abcd
i am coding...

Git提供了git stash命令,可以将当前的工作区信息进行储藏,被储藏的内容可以在将来某个时间恢复出来

git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心的创建分支来修复Bug

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git stash
保存工作目录和索引状态 WIP on dev2: 2f47329 merge with no-ff
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git status
位于分支 dev2
无文件要提交,干净的工作区

储藏dev2工作区之后,由于我们要基于master分支修复bug,所以需要切回master分支,再新建临时分支来修复bug

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout master
切换到分支 'master'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout -b fix_bug
切换到一个新分支 'fix_bug'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ vim Read
gjw@gjw-virtual-machine:~/Desktop/gitcode$ ls
file1  file2  ReadMe
gjw@gjw-virtual-machine:~/Desktop/gitcode$ vim ReadMe 
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git add .
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git commit -m "fix bug: f"
[fix_bug 7cdd7ca] fix bug: f
 1 file changed, 1 insertion(+), 1 deletion(-)

修复完成后,切换到master分支,并完成合并,最后删除fix_bug分支

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout master
切换到分支 'master'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git merge --no-ff -m "merge fix_bug" fix_bug
Merge made by the 'ort' strategy.
 ReadMe | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git status
位于分支 master
无文件要提交,干净的工作区
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat ReadMe 
hello git
hello world
bbb on dev branch
abcdef

至此,bug的修复已经完成,现在回到dev2分支进行开发,需要恢复刚才保存的工作现场,先使用git stash list查看工作现场存在哪

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git stash list
stash@{0}: WIP on dev2: 2f47329 merge with no-ff

现在使用git stash pop命令恢复现场,恢复的同时也会把stash也删了

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git stash pop
位于分支 dev2
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git restore <文件>..." 丢弃工作区的改动)
	修改:     ReadMe

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
丢弃了 refs/stash@{0}(2257a06a5b5892dfbe35baaacad6e5ea6f2842c1)

因为dev2分支是在bug存在的情况下开发的,此时恢复后,仍然是存在bug的,此时master分支是修复完bug的.

我们的最终目的是要让master合并dev2分支的,那么正常情况下我们切回master分支直接合并即可,但这样是有一定风险的,因为在合并时可能会有冲突,而代码冲突需要我们手动解决(在master上解决).无法保证对于冲突问题可以一次性解决掉.

解决这个问题的方法就是: 在自己的本地分支上合并master,对本地分支进行修改和测试,调试完成后,再合并回master.

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git merge --no-ff -m "merge master" master
自动合并 ReadMe
冲突(内容):合并冲突于 ReadMe
自动合并失败,修正冲突然后提交修正的结果。
gjw@gjw-virtual-machine:~/Desktop/gitcode$ vim ReadMe 
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git add .
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git commit -m "merge master fix"
[dev2 fd1be65] merge master fix
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git checkout master
切换到分支 'master'
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git merge --no-ff -m "merge dev2" dev2
Merge made by the 'ort' strategy.
 ReadMe | 1 +
 1 file changed, 1 insertion(+)
gjw@gjw-virtual-machine:~/Desktop/gitcode$ cat ReadMe
hello git
hello world
bbb on dev branch
i am coding... DONE
abcdef

在合并完代码后,删除掉dev2fix_bug分支

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git branch 
  dev2
  fix_bug
* master
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git branch -d dev2
已删除分支 dev2(曾为 fd1be65)。
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git branch -d fix_bug
已删除分支 fix_bug(曾为 7cdd7ca)。

删除临时分支

在分支上的功能开发完成后,需要合并,然后删除掉该分支,可是如果该分支上的功能开发到了一半,被叫停了,该如果销毁呢

传统的git branch -d命令是不行的,此时可以使用git branch -D

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git branch -d dev3
error: 分支 'dev3' 没有完全合并。
如果您确认要删除它,执行 'git branch -D dev3'。
gjw@gjw-virtual-machine:~/Desktop/gitcode$ git branch -D dev3
已删除分支 dev3(曾为 6c01871)。

远程仓库

向远程仓库推送

本地已经clone成功远程仓库后,便可以向仓库中提交内容,这里举例新增一个file.txt文件

注意:之前设置的全局name和email,这两项配置需要和gitee上配置的信息相同.

bash 复制代码
git push <远程主机名> <本地分支名>:<远程分支名>
#如果本地分支和远程分支名相同,可以将冒号":"和后面的远程分支名一起省略
git push <远程主机名> <本地分支名>

拉取远程仓库

如果远程仓库的分支领先于本地仓库的分支,这时就需要将远程仓库中的代码拉取至本地

bash 复制代码
git pull <远程主机名> <远程分支名>:<本地分支名>
#与推送相同,如果两个分支名相同,则可以进行省略
git pull <远程主机名> <远程分支名>

配置Git

忽略特殊文件

日常开发中,如果有些文件不想提交到远端,比如保存数据库密码等的配置文件,可以在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件了

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/post-hub$ vim .gitignore
gjw@gjw-virtual-machine:~/Desktop/post-hub$ cat .gitignore
*.so
#不想忽略的文件前面加上感叹号"!"
!b.so

如果有时候就是想添加一个文件到Git,但由于这个文件被.gitignore忽略了,根本添加不了,可以使用-f强制添加

bash 复制代码
git add -f [filename]

ail,这两项配置需要和gitee上配置的信息相同.

bash 复制代码
git push <远程主机名> <本地分支名>:<远程分支名>
#如果本地分支和远程分支名相同,可以将冒号":"和后面的远程分支名一起省略
git push <远程主机名> <本地分支名>

拉取远程仓库

如果远程仓库的分支领先于本地仓库的分支,这时就需要将远程仓库中的代码拉取至本地

bash 复制代码
git pull <远程主机名> <远程分支名>:<本地分支名>
#与推送相同,如果两个分支名相同,则可以进行省略
git pull <远程主机名> <远程分支名>

配置Git

忽略特殊文件

日常开发中,如果有些文件不想提交到远端,比如保存数据库密码等的配置文件,可以在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件了

bash 复制代码
gjw@gjw-virtual-machine:~/Desktop/post-hub$ vim .gitignore
gjw@gjw-virtual-machine:~/Desktop/post-hub$ cat .gitignore
*.so
#不想忽略的文件前面加上感叹号"!"
!b.so

如果有时候就是想添加一个文件到Git,但由于这个文件被.gitignore忽略了,根本添加不了,可以使用-f强制添加

bash 复制代码
git add -f [filename]
相关推荐
风禾万里5 小时前
Git怎么管理软件版本(代码,模型,配置等)
git
TDengine (老段)5 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)5 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
失散136 小时前
分布式专题——47 ElasticSearch搜索相关性详解
java·分布式·elasticsearch·架构
字节数据平台7 小时前
火山引擎Data Agent再拓新场景,重磅推出用户研究Agent
大数据·人工智能·火山引擎
默默coding的程序猿8 小时前
3.git的分支携带问题是什么?怎么解决?
java·git·python·svn·gitee·github·intellij-idea
铭毅天下9 小时前
Elasticsearch 到 Easysearch 数据迁移 5 种方案选型实战总结
大数据·elasticsearch·搜索引擎·全文检索
跨境小新9 小时前
Facebook广告投放:地域定向流量不精准?x个优化指南
大数据·facebook
ZKNOW甄知科技10 小时前
客户案例 | 派克新材x甄知科技,构建全场景智能IT运维体系
大数据·运维·人工智能·科技·低代码·微服务·制造
币须赢11 小时前
688758赛分科技 阴上阴形态 洗盘上涨?
大数据