当前位置: 首页 > 工具软件 > Git-secure > 使用案例 >

Git笔记总结

邰德业
2023-12-01


1、配置

1.1、配置文件

  • Git配置有三种作用范围,其配置文件位置位置如下
作用范围命令配置文件位置优先级
系统级别systemgit安装目录/etc/gitconfig最低
当前用户global~/.gitconfig (计算机当前用户目录)次之
当前仓库(默认)local本地仓库/.git/config 文件最高

1.2、配置操作命令

① 添加配置

git config [--local|--global|--system] --add section.key value	#语法
git config –-add cat.name tom #在local级别添加配置配置

② 修改配置

git config --global user.name "用户名" #修改用户名配置
git config --global user.email "邮箱"  #修改用户邮箱配置

git config --global color.ui true  #让Git显示颜色,会让命令输出看起来更醒目

备注:不指定作用范围的默认使用local范围

③ 查询配置

git config --local -l  #查看仓库级别配置
git config --global -l #查看用户级别配置
git config --system -l #查看系统级别配置
git config -l		   #查看所有的配置信息,依次是系统级别、用户级别、仓库级别,不同级别配置可以重复,以优先级高的为准

git config user.name  #查询指定配置项,没指定配置界别的默认查询local级别
git config --global user.name #查询指定级别的某项具体配置

④ 删除配置

git config [--local|--global|--system] --unset section.key

备注:可以直接打开文件进行增删改查操作

1.3、秘钥

这条命令的目的是为了让本地机器ssh登录远程机器上的GitHub账户无需输入密码

① 生成

ssh-keygen -t rsa -b 4096 -C "邮箱"	#生成秘钥,该命令执行后敲三次回车

ssh-keygen:SSH 为 Secure Shell 的缩写,SSH
-t rsa:-t是type的缩写,-t即指定密钥的类型,密钥的类型有两种,一种是RSA(默认),一种是DSA:
-b 4096:b是bit的缩写,-b 指定密钥长度。密钥,最小要求768位,默认是2048位。该参数指定RSA密钥长度为4096位。
DSA密钥必须恰好是1024位(FIPS 186-2 标准的要求)。
-C "邮箱":-C表示要提供一个新注释(comment),用于识别这个密钥,所以不一定非要填邮箱,可以是任何内容。

② 查询

在C:\Users\issuser.ssh目录下生成公钥和私钥文件。

③ 删除

删除用户目录下该目录即可C:\Users\issuser.ssh

1.4、凭证

① 常用凭证管理方式

管理方式缓存位置备注
默认不缓存每一次连接都会询问你的用户名和密码
cache内存凭证存放在内存中一段时间,缓存相关文件保存在当前用户根目录的 git-credential-cache 中,
默认保存15分钟,可以通过选项指定缓存的时间 --timeout
store硬盘用明文的形式存放在磁盘中,–file 选项可以自定义存放密码的文件路径(默认是~/.git-credentials)
mananger若安装Git时安装了GitGUI,自动会在system级别中设置credential.helper为manager。
并且不配置所处级别(system、global或者local)如何,一旦设置了manager,都优先使用该方式

② 指定凭证保存方式

git config --global credential.helper store #指定凭证保存在硬盘文件上
git config --global credential.helper cache --timeout=300 #指定凭证保存在内存中5分钟,默认保存15分钟

③ 修改凭证

如果是更换git账号,先将windows下c盘对应用户下的C:\Users\issuser\ .git-credentials文件删除,然后重新生成凭证即可

④ 删除凭证

git credential-manager uninstall  #删除凭证

⑤查看凭证

控制面板\用户帐户和家庭安全\凭据管理器

git config --list | grep credential   #查看凭证配置方式

2、常用操作命令

2.1、创建仓库

① 创建本地仓库

git init	#在目录下执行会将该目录指定为git仓库,文件中生成.git隐藏文件夹

② 克隆远程仓库

git clone 远程url	#从远程仓库克隆仓库

2.2、提交相关命令

① 添加到缓存区

git add 文件名			#添加指定文件
git add *.java		   #添加所有java文件
git add -A 或 git add . #添加所有改动

② 提交

git commit -m "提交描述"	#将缓存区的内容提交到本地仓库

③ 查看仓库当前状态

git status	#根据提示内容查看是否有没被添加的改动或没被提交的改动

④ 查看变化

git diff 文件名	#工作区——>缓存区
git diff HEAD -- file	#工作区——>版本库
git diff --cache	#缓存区——>版本库

⑤ 查看提交历史

git log	#查看提交记录,信息比较多显的混乱
git log --oneline	#查看主要内容,精简
git log --pretty=oneline #效果同上

⑥ 版本回退—已提交

git reset --hard HEAD^ 	#回退到上一个版本,HEAD表示当前版本,一个^表示一个版本
git reset --hard HEAD~100	#回退到往上100个版本
git reset --hard commit_id	#回退到指定版本,commit_id为提交记录id

⑦ 撤销修改—未提交

git checkout -- readme.txt	#分两种情况如下:
                            #没有添加到暂存区时,会回到和版本库一模一样的状态
                            #已经添加到暂存区后,又作了修改,撤销修改就回到添加到暂存区后的状态。
                            
git reset HEAD 文件名		#可以把暂存区的修改撤销掉unstage,重新放回工作区,在执行上边checkout命令将工作区改动撤回

⑧ git命令记录

git reflog 	#用来记录你执行的每一次命令,reflog回流的意思

⑨ 删除文件

手动删除文件后存在两种情况,确定删除、误删除需要恢复

git rm readme.txt	#确实要删除该文件时执行
git checkout -- test.txt	#误删除恢复,文件中改动无法恢复

2、分支

2.1、分支类型

分类分类描述备注
master最终发布版本整个项目中有且只有一个
develop开发分支原则上项目中有且只有一个
feature功能分支用于开发一个新的功能
release预发布版本介于develop和master之间的一个版本,主要用于测试
hotfix修复补丁用于修复master上的bug,直接作用于master

2.2、分支操作命令

① 创建+切换到dev分支:

#第一种写法:
	git checkout -b dev      #git checkout命令加上-b参数表示创建并切换,相当于以下两条命令
		||
	git branch dev			 #创建分支
	git checkout dev		 #切换分支

#第二种写法:
	git switch -c dev		 #创建并切换到新的dev分支
	git switch master		 #切换到已有的master分支

克隆远程仓库并创建本地dev分支与远程仓库origin的dev分支关联

git clone 远程仓库url	#默认克隆远程仓库master分支
git checkout -b dev origin/dev		#克隆后在本地创建dev分支并关联远程仓库origin的dev分支,本地和远程分支的名称最好一致

② 查看分支

git branch	#列出所有分支,当前分支前面会标一个*号

③ 切换分支

git checkout 分支名
git switch 分支名

④ 合并分支

git merge dev	#dev分支的工作成果合并到当前分支上

⑤ 删除分支

git branch -d dev

2.3、分支合并策略

① Fast forward 模式

git merge dev	#正常合并时会使用该模式,直接将master指针指向分支。	
git log --graph --pretty=oneline --abbrev-commit	#查看日志记录看不出来曾经做过分支合并	

② 禁用 Fast forward 模式

git merge --no-ff -m "描述信息" dev		#--no-ff参数,表示禁用Fast forward
git log --graph --pretty=oneline --abbrev-commit	#可以用普通模式合并,合并后分支历史上可以看出分支信息,能看出来曾经做过合并

2.4、分支合并冲突解决步骤

①尝试合并分支

git merge dev	#将dev分支尝试合并到当前分支

②存在冲突时查看冲突文件

git status

③打开冲突文件查看冲突位置并手动解决

	<<<<<<< HEAD
	分支1冲突内容
	=======
	分支2冲突内容
	>>>>>>> feature1

④手动解决冲突后再提交

git add readme.txt 
git commit -m "解决冲突"

⑤查看分支合并情况

git log --graph --pretty=oneline --abbrev-commit

2.5、隐藏工作区

当前分支进行的开发还没提交需要紧急修复生产bug时可以使用stash功能,把当前工作现场“储藏”起来,等bug修复完成恢复现场后继续工作。

① 隐藏工作区

git stash	#隐藏工作区
git status	#此时查看工作区,就是干净的(除非有没有被Git管理的文件)

②查看隐藏工作区

git stash list

③恢复隐藏工作区

#第一种方式:
	git stash apply		#恢复,但是恢复后,stash内容并不删除
	git stash drop		#删除stash

#第二种方式:
	git stash pop 		#恢复的同时把stash内容也删了

④删除隐藏的工作区(参考③)

git stash drop		#删除stash

2.6、bug分支

每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
在bug分支将bug修复后合并到master分支,将bug分支删除,此时其他分支上该bug依然存在;比如要在dev分支上修复,我们只需要把修复bug的提交所做的修改“复制”到dev分支(只复制bug改动),Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支,命令如下:

git branch			#查看当前分支
switch branch dev	#切换到dev分支
git cherry-pick 4c805e2	#合并bug提交的改动并提交,4c805e2为提交记录id

2.7、Feature 特色分支

每添加一个新功能,最好新建一个feature分支,在上面开发,完成后合并,最后删除该feature分支。

①创建一个分支用来开发新功能

git checkout -b feature_01	#创建分支feature_01

②开发功能完成后提交到本地仓库 add/commit,合并到其他分支,然后删除改功能分支

③废弃该分支

git branch -d feature-vulcan	#git会提示是否确定要删除,确定用-D参数再执行一次命令
git branch -D feature-vulcan	#强制删除

3、远程仓库

3.1、测试远程仓库链接

ssh git@gitee.com   测试通不通
#注意:
	#1、设置自己的全局或本地用户名和邮箱(本地只在当前目录仓库有用)
	#2、使用自己的用户名和邮箱重新生成ssh公钥并配置到gitee等远程仓库
	#3、确保当前网络具有访问权限(22端口是否被禁)

3.2、远程仓库操作

3.2.1、关联远程仓库

① 添加关联

git remote add origin 远程仓库url	#remote 远程,add 添加,origin 远程库的名字,origin是Git默认的叫法,也可以改成别的

克隆远程仓库并创建本地dev分支与远程仓库origin的dev分支关联

git clone 远程仓库url	#默认克隆远程仓库master分支
git checkout -b dev origin/dev		#克隆后在本地创建dev分支并关联远程仓库origin的dev分支,本地和远程分支的名称最好一致

设置当前本地分支的默认远程分支

git branch --set-upstream-to <branch-name> origin/<branch-name>。	#--set-upstream-to 简写为 -u
git branch --set-upstream-to dev origin/dev 

② 删除关联

git remote rm origin  #删除当前本地仓库与远程仓库origin的关联

③ 查询关联

git remote 		#远程库的信息,只显示远程仓库名字
git remote -v	#显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

3.2.2、pull

将远程仓库内容更新到本地

git pull	#远程库内容更新到本地,相当于下边两个命令组合

git fetch	#从远程分支拉取代码,可以得到远程分支上最新的代码
git merge	#合并

3.2.3、rebase 变基

下边两个命令区别主要是在远程与本地仓库的合并上面

分支直接更新合并时log历史线会有分叉,rebase操作可以把本地未push的分叉提交历史整理成直线
优点:使我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
缺点:本地的分叉提交已经被修改过了。

git pull			#git fetch + git merge
git pull --rebase	 #git fetch + git rebase

git rebase
git log --graph --pretty=oneline --abbrev-commit		#查看提交历史

举例:

假设从远端master拉取分支test ,test的代码开发完要提交,假设远端的master的代码此时已经有变动,假如本地代码与远程仓库代码有冲突,在本地解决冲突后如下图:

#分支合并前
      D---E test
      /
 A---B---C---F--- master
#git merge	合并后log记录如下
       D--------E
      /          \
 A---B---C---F----G---   test, master
#git rebase	合并后log记录如下
A---B---D---E---C'---F'---   test, master

3.2.4、push

​ ① 第一次推送

推送前先关联远程仓库然后将最新远程仓库内容更新到本地库,否则会报错

git push -u origin master	#第一次推送使用-u 把本地的master分支内容推送到远程master分支,还会把本地和远程分支关联起来

git branch --set-upstream-to dev origin/dev	#关联 --set-upstream-to 简写为 -u

​ ② 关联后推送

git push origin master 		#将本地仓库内容推送到远程仓库

​ ③ 第一次向远程仓库推送内容报错
​ 报错提示如下:

		$ git push origin master
			To url
			 ! [rejected]        master -> master (non-fast-forward)
			error: failed to push some refs to url
			hint: Updates were rejected because the tip of your current branch is behind
			hint: its remote counterpart. Integrate the remote changes (e.g.
			hint: 'git pull ...') before pushing again.
			hint: See the 'Note about fast-forwards' in 'git push --help' for details.

原因:远程仓库有内容或文建本地仓库没有更新,要先将远程仓库内容拉取下来再推送,解决如下:

git pull --rebase origin master		#先执行	
git push -u origin master			#再执行	

3.3、多人合作开发

① 首先,可以试图用git push origin <branch-name>推送自己的修改;

② 如果推送失败,则因为远程分支比你的本地代码更新,需要先用git pull试图合并;

③ 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,执行如下命令

git branch --set-upstream-to <branch-name> origin/<branch-name>。
git branch --set-upstream-to dev origin/dev 

④如果合并有冲突,则解决冲突,并在本地提交;没有冲突或者解决掉冲突后,再推送就能成功!

git push origin dev

4、其他

4.1、起别名

git config --global alias.st status		#告诉Git使用st就表示status,git status 与 git st执行效果一样

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"	#指定log输出格式

4.2、log输出格式化

git log --pretty=format:"%h" 
git log --pretty=format:'%h %at | %s%d [%an]' --graph --date=short
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"	#指定log输出格式

4.3、配置忽略文件.gitignore

4.3.1、分类

配置文件作用域备注
本地仓库目录/.gitignore当前仓库管理当前本地仓库的文件的Git提交行为。
.git/info/exclude当前仓库临时指定该项目的行为,这种方式指定的忽略文件的根目录是项目根目录。
命令指定全局在不同的项目开发者之间是不共享的,是属于Git应用级别的行为。
git config --global core.excludesfile ~/.gitignore

4.3.2、创建.gitignore

① 创建.gitignore文件

在当前目录生成文件.gitignore,并在其中添加要忽略的文件或目录,每行表示一个忽略规则。

② 让Git识别该配置文件

git config core.excludesfiles .gitignore	#默认本地仓库
git config --global core.excludesfile ~/.gitignore	#配置全局

③ .gitignore不生效解决办法

.gitignore只能忽略那些原来没有被跟踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。解决方法就是先把本地缓存删除(改变成未track状态),然后再提交

git rm -r --cached
git add
git commit -m "描述"

④ 再次推送后远程仓库将不显示要忽略的文件

git push origin master

4.3.3、忽略规则

4.3.3.1、规则优先级(由高到低)

  • 从命令行中读取可用的忽略规则
  • 当前目录定义的规则
  • 父级目录定义的规则,依次地推
  • $GIT_DIR/info/exclude 文件中定义的规则
  • core.excludesfile中定义的全局规则

4.3.3.2、规则匹配语法

符号作用转义
空格不匹配任意文件,可作为分隔符可用反斜杠转义
# 开头#开头的文件标识注释可用反斜杠转义
! 开头排除,用来指定规则的例外情况可用反斜杠转义
/ 开头只匹配文件夹以及在该文件夹路径下的内容,但是不匹配该文件
结尾 /匹配项目根目录,如果一个模式不包含斜杠,则它匹配相对于当前 .gitignore
文件路径的内容,如果该模式不在 .gitignore 文件中,则相对于项目根目录
**匹配多级目录,可在开始,中间,结束
?匹配单个字符
[ ]匹配单个字符列表

4.3.3.3、规则匹配示例

bin/			#忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin			#忽略根目录下的bin文件
/*.c			#忽略 cat.c,不忽略 build/cat.c
debug/*.obj	     #忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj
**/foo			#忽略/foo, a/foo, a/b/foo等
a/**/b			#忽略a/b, a/x/b, a/x/y/b等
!/bin/run.sh	#不忽略 bin 目录下的 run.sh 文件
*.log			#忽略所有 .log 文件
config.php		#忽略当前路径的 config.php 文件

5、备注

5.1、常用格式化

	%H: commit hash
    %h: 缩短的commit hash
    %T: tree hash
    %t: 缩短的 tree hash
    %P: parent hashes
    %p: 缩短的 parent hashes
    %an: 作者名字
    %aN: mailmap的作者名字 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
    %ae: 作者邮箱
    %aE: 作者邮箱 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
    %ad: 日期 (--date= 制定的格式)
    %aD: 日期, RFC2822格式
    %ar: 日期, 相对格式(1 day ago)
    %at: 日期, UNIX timestamp
    %ai: 日期, ISO 8601 格式
    %cn: 提交者名字
    %cN: 提交者名字 (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
    %ce: 提交者 email
    %cE: 提交者 email (.mailmap对应,详情参照git-shortlog(1)或者git-blame(1))
    %cd: 提交日期 (--date= 制定的格式)
    %cD: 提交日期, RFC2822格式
    %cr: 提交日期, 相对格式(1 day ago)
    %ct: 提交日期, UNIX timestamp
    %ci: 提交日期, ISO 8601 格式
    %d: ref名称
    %e: encoding
    %s: commit信息标题
    %f: sanitized subject line, suitable for a filename
    %b: commit信息内容
    %N: commit notes
    %gD: reflog selector, e.g., refs/stash@{1}
    %gd: shortened reflog selector, e.g., stash@{1}
    %gs: reflog subject
    %Cred: 切换到红色
    %Cgreen: 切换到绿色
    %Cblue: 切换到蓝色
    %Creset: 重设颜色
    %C(...): 制定颜色, as described in color.branch.* config option
    %m: left, right or boundary mark
    %n: 换行
    %%: a raw %
    %x00: print a byte from a hex code
    %w([[,[,]]]): switch line wrapping, like the -w option of git-shortlog(1)
   %d: ref名称
    %e: encoding
    %s: commit信息标题
    %f: sanitized subject line, suitable for a filename
    %b: commit信息内容
    %N: commit notes
    %gD: reflog selector, e.g., refs/stash@{1}
    %gd: shortened reflog selector, e.g., stash@{1}
    %gs: reflog subject
    %Cred: 切换到红色
    %Cgreen: 切换到绿色
    %Cblue: 切换到蓝色
    %Creset: 重设颜色
    %C(...): 制定颜色, as described in color.branch.* config option
    %m: left, right or boundary mark
    %n: 换行
    %%: a raw %
    %x00: print a byte from a hex code
    %w([[,[,]]]): switch line wrapping, like the -w option of git-shortlog(1)
 类似资料: