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 <[email protected]> 1745170816 +0800
committer gjw <[email protected]> 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 <[email protected]>
| | Date:   Mon Apr 21 18:00:48 2025 +0800
| | 
| |     merge dev1
| | 
| * commit b487628 (dev1)
| | Author: gjw <[email protected]>
| | Date:   Mon Apr 21 17:54:52 2025 +0800
| | 
| |     md ReadMe; bbb
| | 
* | commit ef5535b
|/  Author: gjw <[email protected]>
|   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 <[email protected]>
| | 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]
相关推荐
Leo.yuan5 小时前
数据仓库建设全解析!
大数据·数据库·数据仓库·数据分析·spark
极小狐8 小时前
如何对极狐GitLab 议题进行过滤和排序?
人工智能·git·机器学习·gitlab
花月C8 小时前
Git 全面解析:从核心概念到生态应用
git
望获linux8 小时前
智能清洁机器人中的实时操作系统应用研究
大数据·linux·服务器·人工智能·机器人·操作系统
三个蔡9 小时前
Java求职者面试:从Spring Boot到微服务的技术深度探索
java·大数据·spring boot·微服务·kubernetes
Elasticsearch11 小时前
Elastic Platform 8.18 和 9.0:ES|QL Lookup Joins 功能现已推出,Lucene 10!
elasticsearch
Lilith的AI学习日记11 小时前
AI提示词(Prompt)终极指南:从入门到精通(附实战案例)
大数据·人工智能·prompt·aigc·deepseek
柚个朵朵12 小时前
IDEA中使用Git
java·git·spring
我是哈哈hh12 小时前
【Git】初始Git及入门命令行
git·gitee·github·版本控制器