git 基本操作

本文详细介绍了Git的基本操作,包括名词解析、文件操作、分支操作、reset不同模式的区别和使用场景,以及远程库的设置。重点讲解了暂存区的工作原理,并通过实例解析了reset --soft、--mixed和--hard的区别。此外,还探讨了diff命令的使用,以及如何设置远程仓库。
摘要由CSDN通过智能技术生成

名词

  • 本地库:repository / HEAD / history / 版本库 / / 历史记录区
  • 暂存区stage / index / 缓存区
  • 工作区:working Directory
  • 远程库:remote

操作

github 刚创建仓库 提示的内容
git start
…or create a new repository on the command line
echo "# koreanchess" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/xxx/xxx.git
git push -u origin main

…or push an existing repository from the command line
git remote add origin https://github.com/xxx/xxx.git
git branch -M main
git push -u origin main

…or import code from another repository
You can initialize this repository with code from a Subversion, Mercurial, or TFS project.
文件操作
  1. 生成git仓库
$ git init
$ git clone https://github.com/xxx/xxx.git
  1. 工作区 → \rightarrow 暂存区
$ git add .
$ git add filename.txt
  1. 暂存区 → \rightarrow
$ git commit -m "some comment"		#忽略没add过的,只提交缓存区内的所有。
$ git commit -m "some comment" filename.txt		#没有add过也一起提交。
  1. 本地库 → \rightarrow 远程库
$ git remote add origin https://github.com/xxx/xxx.git
$ git push -u origin master:master
  1. 本地库 ← \leftarrow 远程库
$ git pull
  1. 暂存区 ← \leftarrow 库(重置缓存)
$ git restore --staged .
$ git restore --staged filename.txt
$ git reset HEAD
$ git reset HEAD -- filename.txt	# 不会产生reflog
  1. 工作区 ← \leftarrow 暂存区 ← \leftarrow
$ git restore --source=HEAD~6 --staged --worktree filename
$ git checkout HEAD~6 filename
$ git reset --hard HEAD
  1. 工作区 ← \leftarrow 暂存区
$ git restore .		# git restore --worktree .
$ git restore filename.txt
$ git checkout .
$ git checkout -- filename.txt
  1. 工作区 ← \leftarrow 库(不影响暂存区)
$ git restore --source=HEAD --worktree test.txt
  1. rm & git rm
$ rm <file>			#仅删除工作区文件
$ git rm <file>			#删除[工作区+暂存区]文件。[工作区/暂存区]如有改动的,则报错
$ git rm --cached <file>		#仅删除暂存区文件。[工作区]如有改动没add的,则报错
  • git rm 是 git bash操作。而 rm命令 linux bash就有的东西,是用来删除文件用的。所以rm可以在任何地方使用,而git rm只能在git仓库里使用。
  • 如果想删除HEAD仓库里的文件,好像没有专门的命令,只能commit作log。具体操作是:rm→add→commit 或 git rm→commit
log
$ git config --global alias.logtree 'log --graph --pretty=oneline --abbrev-commit'
$ git log --graph --pretty=oneline --abbrev-commit	#设置完后等于git logtree
$ git reflog
$ git stash
$ git stash list
$ git stash pop
$ git stash apply stash@{$num}
$ git stash drop stash@{$num}
$ git stash clear
分支操作
  • 查看分支
$ git branch
$ git branch -a
  • 生成分支
$ git branch <branch-name>
  • 选择分支
$ git switch <branch-name>		#切换
$ git switch -c <branch-name>	#创建&切换
$ git checkout <branch-name>
$ git checkout -b <branch-name>
  • 删除分支
$ git branch -d <branch-name>
$ git branch -D <branch-name>	#强制删除(未合并)
  • 合并分支
$ git merge dev
$ git merge --no-ff -m "merge with no-ff" dev
$ git merge --abort		#取消merging状态
$ git cherry-pick 45e02c8
reset三种模式区别和使用场景
  • 区别:
  1. –hard:重置位置的同时,直接将 working Tree工作目录、 index 暂存区及 repository 都重置成目标Reset节点的內容,所以效果看起来等同于清空暂存区和工作区。

  2. –soft:重置位置的同时,保留working Tree工作目录和index暂存区的内容,只让repository中的内容和 reset 目标节点保持一致,因此原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files)。所以效果看起来就是工作目录的内容不变,暂存区原有的内容也不变,只是原节点和Reset节点之间的所有差异都会放到暂存区中。

  3. –mixed(默认):重置位置的同时,只保留Working Tree工作目录的內容,但会将 Index暂存区 和 Repository 中的內容更改和reset目标节点一致,因此原节点和Reset节点之间的【差异变更集】会放入Working Tree工作目录中。所以效果看起来就是原节点和Reset节点之间的所有差异都会放到工作目录中。

  • 使用场景:
  1. –hard:(1) 要放弃目前本地的所有改变時,即去掉所有add到暂存区的文件和工作区的文件,可以执行 git reset -hard HEAD 来强制恢复git管理的文件夹的內容及状态;(2) 真的想抛弃目标节点后的所有commit(可能觉得目标节点到原节点之间的commit提交都是错了,之前所有的commit有问题)。

  2. –soft:原节点和reset节点之间的【差异变更集】会放入index暂存区中(Staged files),所以假如我们之前工作目录没有改过任何文件,也没add到暂存区,那么使用reset --soft后,我们可以直接执行 git commit 將 index暂存区中的內容提交至 repository 中。为什么要这样呢?这样做的使用场景是:假如我们想合并「当前节点」与「reset目标节点」之间不具太大意义的 commit 记录(可能是阶段性地频繁提交,就是开发一个功能的时候,改或者增加一个文件的时候就commit,这样做导致一个完整的功能可能会好多个commit点,这时假如你需要把这些commit整合成一个commit的时候)時,可以考虑使用reset --soft来让 commit 演进线图较为清晰。总而言之,可以使用–soft合并commit节点。

  3. –mixed(默认):(1)使用完reset --mixed后,我們可以直接执行 git add 将這些改变果的文件內容加入 index 暂存区中,再执行 git commit 将 Index暂存区 中的內容提交至Repository中,这样一样可以达到合并commit节点的效果(与上面–soft合并commit节点差不多,只是多了git add添加到暂存区的操作);(2)移除所有Index暂存区中准备要提交的文件(Staged files),我们可以执行 git reset HEAD 来 Unstage 所有已列入 Index暂存区 的待提交的文件。(有时候发现add错文件到暂存区,就可以使用命令)。(3)commit提交某些错误代码,或者没有必要的文件也被commit上去,不想再修改错误再commit(因为会留下一个错误commit点),可以回退到正确的commit点上,然后所有原节点和reset节点之间差异会返回工作目录,假如有个没必要的文件的话就可以直接删除了,再commit上去就OK了。

作者:carway
链接:https://www.jianshu.com/p/c2ec5f06cf1a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

diff
  1. 缓存区 ↔ \leftrightarrow
$ git diff --cached test.txt

diff --git a/test.txt b/test.txt
index f7fab52..c67d401 100644
--- a/test.txt
+++ b/test.txt
@@ -7,4 +7,6 @@ sixth
 seventh
 eighth
 nineth
-tenth
\ No newline at end of file
+tenth
+eleventh
+twelveth
\ No newline at end of file
  1. 工作区 ↔ \leftrightarrow 缓存区
$ git diff test.txt
  1. 工作区 ↔ \leftrightarrow
$ git diff HEAD -- test.txt
$ git diff 243550a		#与工作区比较列出所有有差异的文件及内容
$ git diff 243550a test.txt		#与工作区比较该文件
  1. ↔ \leftrightarrow
$ git diff 243550a 24bc01b test.txt	#较旧的id 较新的id

文档依据:2.2 Git 基础 - 记录每次更新到仓库
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容。
若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --staged 命令。
请注意,git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件,运行 git diff 后却什么也没有,就是这个原因

关于 暂存区 的个人理解

很多博主说 commit 之后暂存区就清空了,但根据我实验结果不是这样的,证据如下。(git version 2.29.2.windows.1)

  1. commit后干净的状态下 .git/index文件有一定的大小(199KB)
  2. commit后干净的状态下,执行 git reset --soft HEAD^ ,git status 会显示绿色的暂存区待提交文件。当然不排除 reset --soft 有操作暂存区的隐藏功能
  • 因此,我的结论:缓存区存储的东西,可以理解为完整的文件系统,依据是reset --soft 和 diff / diff --cached。

remote

设置
  • git config
# 会记录在commit
# 查
$ git config [--local|--global|--system] -l
# 位置:/etc/gitconfig		~/.config/git/config		.git/config
# 增
$ git config --global --add section.key value
# 改
$ git config --global user.name "cunlim"	#修改
# 删
$ git config --global --unset section.key
  • settings - SSH
$ ssh-keygen -t rsa -C "2502825404@qq.com"
#位置:~/.ssh/id_rsa(私密)	id_rsa.pub(公密)
  • 远程地址
$ git remote -v
$ git remote show origin
$ git remote add origin https://github.com/xxx/xxx.git
$ git remote rm origin		# 删除远程仓库
$ git remote rename old_name new_name	# 修改仓库名
  • push / pull
$ git clone https://github.com/xxx/xxx.git	#需要登录github账号
$ git clone git@github.com:xxx/xxx.git		#只要有ssh公密
$ git clone <远程仓库地址>
$ git clone -b <指定分支名> <远程仓库地址>
$ git push	#把当前分支推送到远程同名分支
$ git push origin <branch-name>
$ git pull origin <branch-name>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值