git操作笔记

编程知识 更新时间:2023-05-03 03:17:43

查询git命令

$ git --help

概述

Git是开源的分布式版本控制系统,git可以有效、高速地处理从很小到非常大的项目版本管理。

git 瘦身 解决 .git文件夹过大的问题, .git文件主要用来记录每次提交的变动,当我们的项目越来越大的时候, .git文件越来越大。

很大的可能是因为提交了大文件,如果你提交了大文件 A,那么即使你在之后的版本中将其删除,但实际上,记录中的大文件仍然存在。
使用git branch-filter来遍历git history tree, 可以永久删除history中的大文件,达到让.git文件瘦身的目的。

你可以调用 git gc --aggressive --prune ,它会在你的版本库中执行垃圾回收并修剪旧对象。


 

忽略文件


不是所有文件都需要提交。
在主目录下建立  .gitignore 文件,用来忽略文件。语法:


使用码云
github有墙,比较慢,国内一般使用gitee。公司会搭建自己的服务gitlab 。下载下来在linux部署就可以了。

windows上安装Git

windows上需要安装Git客户端程序,可以从Git官网直接下载安装程序,然后按默认选项安装即可。

安装后,进入你想上传的项目文件夹下,然后右键点击 Git Bash Here ,就会进入该目录下的命令行窗口。

创建本地仓库

$ git init
只需要简单地运行 git init, 就可以将当前目录,转变成一个 Git 仓库,这样你就可以对它进行版本管理了。

把当前目录初始化为,可被git管理的仓库
$ git init

将产生.git隐藏的文件夹。.git目录里存放了本地库相关的文件,不要删除和修改。

.git目录里的内容:

设置签名

安装完成后,还需要设置签名,用户名和邮箱,是用来标识开发人员身份的,不会给邮箱发邮件。

在代码托管中心,如gitbug,gitee码云,上的登录与这里的用户名和邮箱没有一点关系。

项目(仓库)级别:只在当前本地库有效。不带--global

系统用户级别:登录操作系统的用户范围。 带有--global

config 配置指令
git config
  config 配置有system级别 global(用户级别) 和local(当前仓库)三个 设置先从system-》global-》local  底层配置会覆盖顶层配置 分别使用--system/global/local 可以定位到配置文件

在命令行输入:

(系统用户级别)

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example"


因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。

注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置。

当然,也可以对某个仓库级别(项目级别),指定不同的用户名和Email地址。仓库级别(项目级别)的签名,保存的位置在.git文件夹的config文件内

系统级别的签名设置:

配置保存在home目录下的

是一个隐藏文件 .gitconfig

查看签名的配置信息

$ git config user.name

$ git config user.email

查看系统config
git config --system --list


查看当前用户(global)配置
git config --global  --list


查看当前仓库配置信息
git config -- local    --list

git did not exit cleanly (exit code 128)

push和clone或者pull都会遇到   SSL certificate problem: unable to get local issuer certificate
(exit code 128)的问题,如:

git.exe push --progress "origin"  devBranch
fatal: unable to access 'https://git-biz.iXXXXXXX/client/': SSL certificate problem: unable to get local issuer certificate

git did not exit cleanly (exit code 128) (969 ms @ 2018/7/7 18:38:06)

提示git SSL certificate problem: unable to get local issuer certificate是由于没有配置信任的服务器HTTPS验证导致的。默认,cURL不信任任何服务器验证。

只需要执行下面命令就可以解决:
git config --global http.sslVerify false

Open Git Bash and run the command if you want to completely disable SSL verification.
git config --global http.sslVerify false

git did not exit cleanly (exit code 1)

这个问题在push时发生,发生后先pull一下可以解决,再push则会OK。因为当前版本不是最新Head指针不在最上面,需要pull拉取最新代码,而后才能push。

.git文件夹内的管理

git did not exit cleanly

如果checkout分支,出现如下错误:

 git checkout  feature/drag

fatal: Unable to create 'D:/devCode2/pcoice/.git/index.lock': File exists.

Another git process seems to be running in this repository, e.g.
an editor opened by 'git commit'. Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue.

只需要删除该文件index.lock 即可

查看项目远程地址

“git remote -v”    查看项目远程地址。

提交本地库

git  add . 跟踪当前文件,提交到暂存区stage
git  commit  -m"注释"   m是message的意思。 提交到本地库   。

add

当前目录下新增的文件,都是untracked状态,未被跟踪状态。

用add命令,提交到暂存区(stage/index),  新增的文件如果不add,就是untracked状态,未被跟踪状态。


$git add .   (注意这里有个点)

名词解释
CR:Carriage Return,对应ASCII中转义字符\r,表示回车
LF:Linefeed,对应ASCII中转义字符\n,表示换行
CRLF:Carriage Return & Linefeed,\r\n,表示回车并换行
众所周知,Windows操作系统采用两个字符来进行换行,即CRLF;Unix/Linux/Mac OS X操作系统采用单个字符LF来进行换行;


据野史记载,在很久以前的机械打字机时代,CR和LF分别具有不同的作用:LF会将打印纸张上移一行位置,但是保持当前打字的水平位置不变;CR则会将“Carriage”(打字机上的滚动托架)滚回到打印纸张的最左侧,但是保持当前打字的垂直位置不变,即还是在同一行。

当CR和LF组合使用时,则会将打印纸张上移一行,且下一个打字位置将回到该行的最左侧,也就是我们今天所理解的换行操作。

随着时间的推移,机械打字机渐渐地退出了历史舞台,当初的纸张变成了今天的显示器,打字机的按键也演变为了如今的键盘。在操作系统出现的年代,受限于内存和软盘空间的不足,一些操作系统的设计者决定采用单个字符来表示换行符,如Unix的LF、MacIntosh的CR。他们的意图都是为了进行换行操作,只是当初并没有一个国际标准,所以才有这样字符上的不同。

结论
所以我们只需要知道CRLF、CR、LF的作用即可。

commit

将暂存区的内容提交到到本地git仓库中
$ git commit -m '本次提交的说明'(说明信息为必填项,最好是信息有意义,便于后期理解)

修改文件后,添加到暂存区后,查看状态:

如果要撤回修改,用checkout。

对于已经跟踪的文件可以一次提交到本地库,命令用git  commit  -am  'msg'  相当于 add 和commit 。

git add .
git commit -m "xxx"
 相当于
git commit -am "xxx" (第三步等于第一步和第二步)

而 新增文件只能用add添加到暂存区后,才能commit提交到本地库。

撤销修改——未push到远程

这里撤销的是在工作区的修改和已经添加add到暂存区的修改,两种场景下的。

场景1:未add

当你改了工作区某个文件的内容,想丢弃工作区的修改时,用命令git checkout -- file。还未add添加到暂存区的情况下

先用  git status查看一下状态,

$ git  status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)

  (use "git checkout -- <file>..." to discard changes in working directory) 

这两点明天再写,我现在的想法是:
1.git checkout – <file_name>是将暂存区的修改重新放回工作区,但只能操作文件内容,不能添加、删除文件;
2.git restore <file_name> 是放弃对工作区的修改,对文件的操作(添加、删除)和文件内容的操作都能使用此命令;


3.而git reset HEAD <file_name>与 git restore --staged <file_name>的作用相同。

git restore --staged <file_name>相当于撤销git add 命令,

Git会告诉你,git checkout -- file可以丢弃工作区的修改:

        $ git checkout -- readme.txt

git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,完全是另一回事了。

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销

就是让这个文件readme.txt回到最近一次git commit或git add时的状态。

场景2:已经add,没有commit

当你把某个文件的内容,add添加到了暂存区时,还未commit 时, 想丢弃修改,分两步:

第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。

用git status查看一下,修改只是添加add到了暂存区,还没有提交commit到本地仓库


$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
 
    modified:   readme.txt

Git告诉我们,用命令git reset HEAD <file>把暂存区的修改撤销掉(unstage),重新放回工作区:

$ git reset HEAD readme.txt
Unstaged changes after reset:
M    readme.txt
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

再用git status查看一下,现在暂存区是干净的,工作区有修改:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
 
    modified:   readme.txt

还记得如何丢弃工作区的修改吗?

$ git checkout -- readme.txt
 
$ git status
On branch master
nothing to commit, working tree clean

   

查看提交日志   

git  log  显示日志

简化日志

git  log    --pretty=oneline   简化日志,每个版本只有一行。

git  log    --oneline               版本的哈希值只显示开头的7位,每个版本只有一行。

git  log -5  --pretty=oneline     输出5行,每个版本只占一行。

git   reflog         也是每个版本只占一行,查看过去和未来的所有版本。     所有的版本分支历史

放弃不慎修改的未提交的代码

未add的修改

git   restore   <file>

git restore   .  所有文件

撤销已经commit到本地仓库的修改——版本回退

 跳到某一个版本,使用索引值跳转

git  reset  --hard   786dds   回退特征码(索引值,哈希码)含有786dds   的版本。

把add到暂存区的文件。撤回。

git  reset  HEAD

如果我们执行:git reset HEAD
任何事情都不会发生,这是因为我们告诉GIT重置这个分支到HEAD,而这个正是它现在所在的位置。

git  reset  --hard HEAD^ 回退一个版本

git  reset  --hard HEAD^^  回退两个版本

回退多少个版本加多少个^。

波浪线~ 回退版本

git  reset  --hard HEAD~1  回退一个版本

git  reset  --hard HEAD~50  回退到前面的第50个版本

reset的参数

--hard :工作区、暂存区、本地库 都回退。

--soft    :仅修改本地库的HEAD指针,就是只有本地库回退。工作区、暂存区不动。

--mixed  :本地库和暂存区回退,工作区内容不动。

将已经push到远程仓库的代码,回滚到指定版本

线上功能要回退,就要回滚代码。

已commit并push到远程分支后,发现上次push的内容多了,想回退到上次push后的状态:

git reflog  先查看当前分支提交的版本commit

可以看到最近的这两次提交的版本,前面的7位码就是commit,现在想撤回最后一次提交,回退到上上次提交后


1、 git reset --hard HEAD~1             

回退到上个commit 使用~1 ,回退X个提交commit 参数是~X 。

再看一下log,

发现HEAD现在已经指向了上一次的提交,查看代码,确认本地分支已经回退到上个commit了,接下来就是将本地分支的回退,强行推送到远程分支。

如果要回滚到绿点或者红点处,就不能用HEAD~数字了,而是要使用回滚到指定版本的sha1号。

回滚到指定的版本
git reset --hard     8c8b84158(版本号sha1值)


2、 git push --force 强制推送

直接用git push推送,会因为本地分支比远程分支落后,而拒绝推送,这里要执行强制推送,

即   git push --force 。

到这里就回退成功了。

如果不行可以强制推送到远程分支:

git push -f  origin   pre-master  

其中origin   pre-master是远程分支名。

强制提交,将本地回滚的代码推送到远程仓库,这里需要加强制的选项 -f 或 --force;

在这里要说明下git push -f 表示强制将目前自己本机的代码库推送到远端,并覆盖;此命令需要跟团队成员协商,慎重使用!
 

恢复被误删的文件

文件被误删,还没有提交到本地库,我们可以恢复回来: git checkout   -- git02.txt       就会把在工作区被删除的文件git02.txt 恢复回来。

已经提交到本地库的,使用版本回退,可以把被删除的文件恢复回来。 git  reset  --hard HEAD^ 回退一个版本

文件删除

删除文件被当做是修改文件的一种。

确定要删除一个文件命令,  git rm  文件名    ,  git   rm  git02.txt    。

git ls -files  查看git仓库里的文件。

比较文件

git diff  [文件名]    ,将工作区的该文件同暂存区的做比较。

git  diff  [本地库中历史版本]  [文件名]   ,将工作区中的文件和本地库历史记录 做比较。

创建远程仓库

在github或gitee码云上,注册创建一个远程库。
git remote -v    查看所有别名

将本地代码库关联 远程代码库
git remote add origin https://gitee/qlqaq/projects/mycode.git  

以后就可以用origin 代替 https://gitee/qlqaq/projects/mycode.git  这个远程地址了。也就是新建了一个别名origin用来代替网络地址。

git remote add origin https://gitee/fhs1/ceshi.git //创建别名

推送到远程

将本地代码推送到指定远程的仓库中
$ git push -u origin master

git push origin master    上传到远程仓库

新建远程分支

新建分支并推送到远程:把新建的本地分支push到远程服务器,远程分支与本地分支同名,可以随意起名:

$ git push origin pre-master:  pre-master  //将本地pre-master 分支推送至远程pre-master分支
使用git branch -a查看所有分支,会看到多了  pre-master这个远程分支,说明新建远程分支成功。

克隆远程仓库  

 git  clone   url   把远程代码下载到当前文件夹,文件夹里面有.git 文件夹。

clone命令里包含3个操作:

1、完整的把远程库下载到本地,

2、创建origin远程地址别名,

3、初始化本地库。

给团队添加人员

在网页端添加人员,Add Collaborator 。变成了团队成员,就可以提交代码了,具有写的权限。

拉取远程库

pull = fetch + merge

fetch是拉取远程库的内容到本地库,而不去更新工作区。所以要更新工作区,要用merge

git fetch   [远程库地址别名][远程分支名]

git  merge    [远程库地址别名 / 远程分支名]

git  pull    [远程库地址别名][远程分支名]

此时工作区的文件没有改变,只是本地库获取了远程库的版本。

git  pull  origin  master   拉取远程库版本代码, 本地库,暂存区,工作区,一并更新。

把远程仓库的代码强制跟新到当前分支上面。如果仓库为空这一步可以跳过
  $ git pull --rebase origin master

分支操作

列出分支

列出本地所有的分支
git branch

列出远程所有的分支
git branch -r

列出所有的本地和远程分支

git branch -a

创建与切换分支

创建新分支

git branch  [branch-name]     

例如创建hot_fix分支 :  git branch  hot_fix   

创建新分支并切换到新分支

git checkout  -b   [branch-name]

在主分支master上 执行命令, 新建一个本地分支: 

$ git  checkout -b  dev       //创建本地分支dev,并切换到dev分支上。

$ git checkout -b    pre-master-1118     // 新建名为pre-master-1118     的本地分支,并切换至该分支

拉取远程分支并创建本地新分支

使用如下命令:

git checkout -b  [本地分支名dev]      origin/[远程分支名master]

使用该方式会新建本地分支dev,并自动切换到该本地分支dev。

采用此种方法建立的本地分支会和远程分支建立映射关系。

假设你现在基于远程分支"origin/master",创建一个叫"dev01"的分支,并与origin/master建立映射关系:

$ git checkout -b  dev01  origin/master

切换分支checkout   

git  checkout  master     切换到本地 master   分支上

git  checkout  hot_fix    切换到本地 hot_fix   分支上。

首次获取远程分支

包括创建一个本地分支,然后获取远程分支代码,并与这个新建的本地分支关联上。

git checkout -b  dev   origin/develop

git checkout -b 本地分支名  origin/远程分支名

该命令可以将远程git仓库里的指定分支拉取到本地,这样就在本地新建了一个dev分支,并与指定的远程分支origin/develop关联了起来。

查看本地分支和与它关联的远程分支

$ git branch -vv

与远程分支建立关联

如果当前本地分支和关联的远程分支断开了,则用下面命令可以建立关联。
$ git     branch    -u      origin/devlop

合并分支

第一步,切换到接受新内容的分支上。

第二本,执行merge命令。

先切换到主分支上   git  checkout  master    ,再执行  git  merge  hot_fix   操作。

在主分支上,使用命令将dev分支的代码提交合并到master主分支上
git  merge  dev   只能在主分支上合并分支,不能在分支上执行这个命令。

删除分支

删除本地dev分支

在本地主分支上删除本地dev分支,删除的是本地分支,格式: git branch -d 分支名
git  branch  -d  dev

删除远程分支

$ git push origin --delete   dev

再次使用命令 git branch -a 可以发现,远程分支dev已经被删除。

查看本地所有分支

git branch -a

使用 git branch -a 命令可以查看所有本地分支和远程分支,发现远程的remote分支已经删除了,但本地还显示。

查看本地分支和追踪情况:

git remote show origin

使用命令 git remote show origin,可以查看remote地址,远程分支,还有本地分支与之相对应关系等信息。

 同步本地分支,清理在远端已被删除的分支

红框中的分支是远程分支还在的分支,stale的是在远端已被删除的分支,
清理在远端已被删除的分支:

git remote prune origin

 此时我们就清理了在远端已被删除的分支。

pruned
v.  修剪树枝;打杈;裁减;削减;精简
prune的过去分词和过去式

分支push和pull操作

git  branch  -a   查看本地和远程分支

git  push  origin  branch_name     把本地分支推送到远程

git  push   origin : remote_branch   删除远程分支,同时本地分支还保留

git  checkout -b   local_branch  origin/remote_branch      拉取远程指定分支并在本地创建分支

git branch  -a  可以查看本地和远程的分支

git  fetch 从远程仓库里拉取最新的版本信息,发现其他人新建的leaf02分支。

更改分支名称

git branch -m old_branch new_branch 
// Rename branch locally 


git push origin :old_branch
// Delete the old branch   注意这里冒号前有一个空格


git push --set-upstream origin new_branch
// Push the new branch, set local branch to track the new remote

解决冲突

两个分支的同一个文件,在同一行上都有修改,就产生冲突,到底用哪个版本的,git就会呈现出来询问。如果冲突就要协商,保留谁的代码。

1、编辑冲突文件,删除冲突标记符号,达到满意的文本,保存文件。

2、git  add 文件名   , git commit  -m  “日志信息” (commit 此时是不能带文件名的)

本地分支的冲突

合并分支时产生冲突

提示:自动合并的冲突,同时右侧的分支名master后面提示MERGING。表示处于处理合并的状态。

打开冲突文件git01.txt  修改后,作为最终内容。准备提交,先看一下暂存区状态:

提示使用git  add  来标记已经解决。

git  add  git01.txt   

提交本地库后,退出了MERGING模式,表明冲突已经得到解决。

多人协同解决冲突

避免的办法,先不push,先pull拉下来,在本地修改冲突文件。

pull下来就已经有冲突了,这时就把冲突文件打开,修改后再add提交,直到去push,如果push失败,再pull拉一遍新代码,在本地修改冲突

tag(标签)管理

git也可以在某个时间点打上一个版本标签,例如在某个时间打一个版本,方便标识。

git tag  查看tag(标签)列表

git  tag  -d  v1.1     删除v1.1tag 

git  tag   v1.0      添加本地标签v1.0 

git  tag  -a  tag_name  -m    '注释'      添加本地标签同时加上注释。

此时tag标签都只是在本地库里,还未提交到远程仓库。

git  push  origin  v1.0  将 tag v1.0 提交到远程仓库

删除远端仓库的tag

git  push  origin  :refs/tags/tag_name

根据tag创建分支


现在主分支上有一个tag为v1.0.0,主分支的名字为master.

1.执行:git origin fetch 获得更新

2.根据tag创建新的分支

git branch <new-branch-name> <tag-name>
 

例如:

git branch newbranch   tag_v1.0.0

会以tag_v1.0.0的仓库,创建新的分支newbranch;

3.再通过

git checkout newbranch 
切换到新的分支.

git fetch

git fetch是将远程主机的最新内容拉到本地,用户检查后,自行决定是否合并到工作本机分支中。可以用来fetch远程仓库中新建的所有分支。

而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。

git pull 的过程可以理解为:

git fetch origin master              //从远程主机的master分支拉取最新内容 
git merge FETCH_HEAD        //将拉取下来的最新内容合并到当前所在的分支中
  

更多推荐

git操作笔记

本文发布于:2023-04-30 08:39:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/f8b79c467cc5c15e567c191734c68ff0.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:操作   笔记   git

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 113643文章数
  • 28836阅读数
  • 0评论数