• 自己使用的git总结


    前记

    • 使用的远程仓库是公司自己创建的。
    • 本地使用的是linux系统,通过命令行或者vscode的扩展应用来提交代码。
    • 常用指令部分按照一个常用的克隆——创建分支——修改代码——推送远端的顺序 来进行。
    • 接着介绍一些较常用到的指令。

    安装git

    sudo apt install git
    
    • 1

    Git配置——git config

    配置原因

    • 在从远程端clone等需要权限才可以操作,此时需要进行登录并输入账户名、邮箱、密码,操作较繁琐。

    • 可以通过配置来达到只需要输入密码即可进行操作,后续也可以通过配置SSH直接免密操作。

    git配置账户名和邮箱的代码如下:

    (也可直接执行git config命令查看提示的指令)

    • config配置git环境

    • –global:表示配置整个git环境,指定为全局配置,不使用该参数,则为当前所在仓库配置

    • user.nameuser.email后面的引号内填入远程端登录的账户名和密码

    # 设置全局用户名 第二行为例子
    git config --global user.name "your name"      
    git config --global user.name "runoob"			# 例子
    # 设置邮箱 第二行为例子
    git config --global user.email "your email"    	
    git config --global user.email test@runoob.com	# 例子
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    查看当前git配置

    • 配置好后可通过以下命令查验。
    # 两种命令皆可
    git config -l
    git config --list
    
    • 1
    • 2
    • 3

    git整体流程

    在这里插入图片描述

    借用一下git教程——菜鸟教程的图,通过这张图可以大致清晰的了解add, commit, push, pull, fetch, clone, checkout 等指令具体是在工作区,暂存区、本地仓库及远程仓库哪个过程中实现的。

    • Workspace:开发者工作区,也就是你当前写代码的目录,它一般保持的是最新仓库代码。
    • Index /Stage缓存区,最早叫Stage,现在新版本已经改成index,位于.git目录中,它用来存放临时动作,比如我们做了git add或者git rm,都是把文件提交到缓存区,这是可以撤销的,然后在通过git commit将缓存区的内容提交到本地仓库
    • local Repository本地仓库区,所有的提交都在这里,git会保存好每一个历史版本,存放在仓库区,它可以是服务端的也可以是本地的,因为在分布式中,任何人都可以是主仓库。
    • Remote远程仓库,只能是别的电脑上的仓库,即服务器仓库。

    git 基础配置及分支

    本节内容参考git教程

    初始化——init

    • 使用当前目录作为 Git 仓库,该命令执行完后会在当前目录生成一个 .git 目录。
    • 由于一般都是直接从远程端clone代码到linux本地,因此我个人一般不执行这步
    git init
    git init newrepo  	# 在newrepo目录下生成git仓库
    
    • 1
    • 2

    克隆代码——clone

    git clone和download zip的区别?

    • 下载操作知识将代码下载到指定的目录下,不包含版本历史信息的,只是下载了当前分支最新版本的代码到本地
    • 克隆操作下载的内容里包含了.git目录,这里面有历史版本信息,可以在克隆的文件里进行开发并提交代码。
    # 克隆代码仓库 例子如下
    git clone <repo>					# repo: Git仓库	
    git clone git://github.com/xxx/grit.git  	# 例子
    # 从仓库克隆代码到指定路径,例子如下
    git clone <repo> <directory> 		# directory: 本地目录
    git clone git://github.com/schacon/grit.git mygrit # 克隆到mygrit目录下
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在该部分一般有两种协议,http(s)和SSH,有什么区别?

    • 使用https url克隆:复制好https
      url后,在linux本地可以直接克隆到本地,但每次fetch和push代码都需要输入账号和密码
    • 使用SSH url克隆ssh默认是每次fetch和push代码都不需要输入账号和密码。但需要在克隆之前先配置和添加好SSH key,因此如果想使用SSH,必须是这个项目的拥有者,否则无法添加SSH key。后续会总结如何配置SSH。

    查看分支——git branch

    • 在clone好代码后,做出自己的修改前,最好先搞清楚自己所处的分支并新建分支,之后再根据需求修改代码并提交。
    • 查看HEAD的指向:——git branch
      一般使用git branch就够了。
    git branch          # 查看本地分支名
    git branch -v       # 查看相对详细的本地分支信息
    git branch -a		# 查看包括远程仓库在内的分支名
    git branch -av      # 查看包括远程仓库在内的分支信息
    
    • 1
    • 2
    • 3
    • 4

    创建分支:——git branch (name)

    ——创建分支有两种方法:

    • 通过git branch 创建:
      (后续还需要进入分支)
    git branch (branchname)
    git branch dev 			# 新建一个名称为 dev 的分支
    
    • 1
    • 2
    • 通过git checkout -b 创建并直接进入分支:
    git checkout -b (branchname)
    git checkout -b dev 	# 新建 dev 分支,并切换到该分支上
    
    • 1
    • 2

    切换分支——git checkout

    • 创建完分支以后,需要切换到新建的分支,否则,所有的修改,还是在原来的分支上。
    • 因此在修改代码前,需要确保自己所处的分支是新建的或者指定的分支,在使用branch指令新建后,需要切换到该分支
    • 切换分支:
    git checkout (branchname)
    git checkout master			# 例子
    
    • 1
    • 2

    注意:

    • 当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。
      (讲人话:切换分支后,工作目录下的内容是:切换后的对应分支的最新代码)
    • 切换时需要保持工作区的clean,即:如果已经在工作区作出了更改,但需要进入另一个分支,此时如果直接切换会报错。此时可以通过git stash 或者放弃更改等操作进行修改。

    git 常用指令

    将文件添加到缓存区——git add

    • git add --all
      将当前目录下包括子目录下所有改动的文件提交到暂存区,注意只包括改动的文件不改动的不会放到缓存区。还会把删除的文件也提交进去。
    • git add .
      添加当前目录下的所有文件到暂存区
    git add .					# 添加当前目录下的所有文件到暂存区
    git add [dir]				# 添加指定目录到暂存区,包括子目录
    git add test.c 				# 例子
    git add [file1] [file2] ...	# 添加一个或多个文件到暂存区
    git add --all				# 将当前目录下包括子目录下所有改动的文件提交到暂存区,注意只包括改动的文件,不改动的不会放到缓存区。还会把删除的文件也提交进去
    
    • 1
    • 2
    • 3
    • 4
    • 5

    查看当前仓库状态——git status

    • 当新建文件,将文件加入暂存区,或者其他的修改等等,都可以通过该命令来随时查看当前仓库中文件的状态。
    • git status 命令用于查看在你上次提交之后,是否有对文件进行再次修改
    • 已经提交的文件及没有发生改动的文件不会显示到这里。
    • 命令如下
    git status
    git status -s		# 获得简短的输出结果
    # AM 状态的意思是这个文件在我们将它添加到缓存之后又有改动。
    
    • 1
    • 2
    • 3
    • 显示状态:
      A:未修改
      AM:修改
      Untracked:未提交
      modified:新文件,但未提交

    比较文件的不同——git diff

    • git diff 命令比较文件的不同,即比较文件在暂存区工作区的差异。

    • git diff 命令显示已写入暂存区已经被修改但尚未写入暂存区文件的区别。

    • git diff 和git status区别:
      git status 显示你上次提交更新后的更改或者写入缓存的改动文件名
      git diff 一行一行具体显示这些改动。

    # 查看版本库中所有的改动
    # 尚未缓存的改动
    git diff    			
    git diff [file]			# 查看具体文件的改动
    git diff Readme.md      # 查看具体文件的改动的例子
    # 显示暂存区和上一次提交(commit)的差异
    # 查看已缓存的改动
    git diff --cached
    git diff --staged [file]
    # 查看已缓存的与未缓存的所有改动
    git diff HEAD
    # 显示摘要而非整个 diff
    git diff --stat
    # 显示两次提交之间的差异
    git diff [first-branch]...[second-branch]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    将内容写入暂存区——git commit

    • 如果直接用 git commit 提交,会弹出添加备注的页面,需要添加对应的备注名称。
    • 该名称会显示在远程提交的消息(message)中。
    git commit        				# 如果暂存区有文件,则将其中的文件提交到仓库
    git commit -m [message]			# [message] 是备注信息
    git commit [file1] [file2] ... -m [message] # 提交暂存区的指定文件到仓库区
    git commit -a					# 跳过git add 命令,直接来提交
    git commit --amend				# 重写上一次的提交信息(不会生成新的版本号)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上传代码到远程并合并——git push

    git push 命令用于从将本地的分支版本上传到远程并合并。

    • 如果本地分支名与远程分支名相同,则可以省略冒号:
    git push <远程主机名> <本地分支名>:<远程分支名>
    git push origin master
    git push <远程主机名> <本地分支名>
    git push origin master:master
    # 慎用:本地版本与远程版本有差异,但又要强制推送可以使用 --force 参数
    git push --force origin master
    # 删除主机的分支可以使用 --delete 参数,以下命令表示删除 origin 主机的 master 分支:
    git push origin --delete master
    # 在将本地的 master 分支推送到远程新的 master 分支的同时,还会把本地的 master 分支和远程的 master 分支关联起来。
    git push -u origin master 	# 第一次推送时使用,可以简化后面的推送或者拉取命令使用
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    合并分支的指令及部分问题

    将更改储藏在脏工作目录中——git stash

    使用场景:

    • 情况一
      直接在工作区修改代码后,发现所在的分支不是要提交的分支(比如直接修改的话,可能是在不允许提交的比如主分支进行了修改),需要切换分支。

    • 情况二
      在工作区已经修改了部分代码,但别的分支忽然有bug需要去修改。

    对应的指令:

    • git stash:
      工作区是已修改状态,使用git stash会将当前未提交的修改(工作区的修改和暂存区的修改)先暂时储藏起来。此时使用git status指令可以看到工作区是干净的。
    • git stash pop:
      可取出最近一次储藏的修改到工作区中,并同时将该储藏从储藏记录列表中删除
    • 通常使用这两条指令可解决80%的问题。
    git stash
    git checkout <对应分支>
    git stash pop
    # 情景:修改-储藏-再修改-再储藏——两次
    # 标记此次储藏,以便后期查看
    git stash save [stashMessage]
    git stash save 'add addAge method'	# 例子
    # 查看储藏列表
    git stash list
    # 取出指定index的储藏的修改到工作区中
    git stash apply stash@{index} 
    git stash apply stash@{1} 			# 例子
    # 将指定index的储藏从储藏记录列表中删除
    git stash drop stash@{index}
    # 情况:只提交特定文件,其他改动后续需要
    git add --patch foo            # 只将第一部分加入管理the index
    git stash save --keep-index    # 将其余部分保存起来
    
    
    git stash drop 名称		# 从堆栈中移除某个指定的stash
    git stash clear			# 清除堆栈中的所有内容
    git stash show			# 查看堆栈中最新保存的stash和当前目录的差异
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    git stash pop后发现pop错分支了!!!

    可以使用 git reset --hard ,即可撤销 git stash pop 操作,将当前分支状态恢复。

    而该操作后,git stash 暂存区的记录也不会被删除,可通过 git stash show/git stash list查看。可以重新切换到自己分支并重新git stash pop

    回退版本——git reset

    参数:

    reset参数是重置命令:
    主要为 git reset [head],加上一些参数。

    • mixed
      默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
      将头指针恢复,已经add的暂存区也会丢失掉,工作空间的代码什么的是不变的。
    • soft
      仅仅将头指针恢复,已经add的暂存区以及工作空间的所有东西都不变。
    • hard
      谨慎使用 –-hard 参数,它会删除回退点之前的所有信息。
      参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交。
      即:一切全都恢复,头指针恢复,aad的暂存区消失,代码也恢复到以前状态

    HEAD 说明:

    • HEAD : 表示当前版本
    • HEAD^ : 上一个版本
    • HEAD^^ :上上一个版本
      以此类推
    • HEAD~0 表示当前版本
    • HEAD~1 上一个版本
      以此类推
    git reset [--soft | --mixed | --hard] [HEAD]
    git reset  [HEAD] 					# 可以指定退回某一次提交的版本
    git reset --soft HEAD
    git reset --hard HEAD
    # 例子
    git reset --hard HEAD~3  			# 回退上上上一个版本  
    git reset --hard 'commit_id'    	# 会退到 commit_id 指定的提交版本
    git reset --hard origin/master    	# 将本地的状态回退到和远程的一样 	
    
    # 回退后返回未来的版本
    git reflog							# 查看当前版本库的提交历史
    git reset --hard 'commit_id'
    	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    查看提交历史——git log

    可以看到每次提交的 ID,是一个字符串。
    参数:

    • reverse :参数来逆向显示所有日志
    • graph :查看历史中什么时候出现了分支、合并
    git log 					# 查看历史提交记录
    git log <file>				# 查看具体文件的提交记录
    git blame <file> 			# 以列表形式查看指定文件的历史修改记录
    git log --pretty=oneline    # 单行显示提交历史记录的内容
    
    • 1
    • 2
    • 3
    • 4

    丢弃(撤销)工作区中文件的修改——git checkout –

    当我们在工作中修改了一个文件,但是发现内容好像改的不对,想重新修改,这个时又不知道自己改了什么代码,想撤销修改,可以使用git checkout – 来将文件切换到最近一次的状态。

    git checkout -- <file>		 # 丢弃某文件的修改(撤销修改)
    git checkout -- Readme.md    # 如果 Readme.md 文件在工作区,则丢弃其修改
    git checkout -- .            # 丢弃当前目录下所有工作区中文件的修改
    
    • 1
    • 2
    • 3

    未添加到暂存区之前删除文件——git rm

    只能删除已经提交到版本库中的文件。

    git rm <file>			# 删除已经被提交过的文件
    git rm Readme.md 		# 删除已经被提交过的 Readme.md
    
    • 1
    • 2

    删除分支——git branch -d

    git branch -d dev # 删除 dev 分支
    
    • 1

    合并分支

    git pull = git fetch + git merge

    远程获取代码并合并本地——git pull

    git pull <远程主机名> <远程分支名>:<本地分支名>
    # 例子
    git pull origin master:brantest	# 将远程主机 origin 的 master 分支拉取过来,与本地的 brantest 分支合并。
    # 取回 origin/master 分支,再与本地的 brantest 分支合并。
    git pull origin master			# 远程分支与当前分支合并,则冒号后面的部分可以省略。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    从远程获取代码库——git fetch

    git fetch [alias]	# 配置好远程仓库并想要提取更新的数据
    git merge [alias]/[branch] 	# 以上命令将服务器上的任何更新(假设有人这时候推送到服务器了)合并到你的当前分支。
    
    
    • 1
    • 2
    • 3

    合并分支——git merge

    当我们新建分支并做完工作之后,想要把分支提交至master,只需要切换到master仓库,并执行git merge 分支名就可以了
    (merge即是将对应分支的代码合并到本分支下,是从远端两个已提交的最新代码进行合并的,所以不需要add,commit和push即可完成)

    git checkout master		# 进入master分支
    git merge dev			# 自动将远程端的dev的代码合并进master分支中
    
    • 1
    • 2

    在远程仓库的操作——git remote

    • 本地有一个仓库,怎么把它推送到远程上去?
      使用git remote add origin命令,origin 是github上的仓库名称,意思是远程仓库的意思。
      (实际使用时我好像每次checkout -b后写完代码,直接使用了git push origin <新分支名>进行)
    git remote add origin git@github.com:beiszhihao/test.git
    git push -u origin master
    
    • 1
    • 2
    git remote -v							# 显示所有远程仓库
    git remote show [remote] 				# 显示某个远程仓库的信息
    git remote add [本地的版本库] [url] 		# 添加远程版本库
    git remote rm name  					# 删除远程仓库
    git remote rename old_name new_name  	# 修改仓库名
     git remote prune origin				# 使用prune参数刷新本地分支仓库
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    参考文献

    Git教程详细版
    关于Git这一篇就够了
    git教程
    git stash 命令
    git stash pop 后有冲突时,如何撤销

  • 相关阅读:
    Qt图像处理技术十:得到QImage图像的高斯模糊
    Kubernetes PDB
    精品SpringCloud的高校招生信息管理系统-微服务分布式
    ELK日志监控平台(三)---kibana数据可视化
    java加载证书报错:IOException : version mismatch: (supported: 00, parsed: 01
    ProcessExtensionsAutoConfiguration
    python趣味编程-5分钟实现一个测验应用程序(含源码、步骤讲解)
    linux日常免交互汇总
    企业网络的设计与实施
    磷酸除杂回用去除铁、铝、氟
  • 原文地址:https://blog.csdn.net/qinghuanduji/article/details/126443678