常用git命令
前言:
原链接:生哥哥牛逼(破音)
不争气的生哥哥链接404了,害得我要重新整理
一、概念:
1.基本概念
-
工作区:就是你在电脑里能看到的目录。
-
暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
-
版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:
图中左侧为工作区,右侧为版本库。在版本库中标记为 “index” 的区域是暂存区(stage/index),标记为 “master” 的是 master 分支所代表的目录树。 -
图中我们可以看出此时 “HEAD” 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
-
图中的 objects 标识的区域为 Git 的对象库,实际位于 “.git/objects” 目录下,里面包含了创建的各种对象及内容。
-
当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
-
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
2.git操作示意图
说明:
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
二、命令:
1.基本操作:
-
状态查看
git status
查看工作区、暂存区状态
- 红色文件代表新建或者修改过的文件,仅存在于工作区,未被提交到版本库
- 绿色文件代表已被版本库管理,即存在于工作区和版本库中,未提交到本地仓库 -
添加
-git add [file-name1] [file-name2] ...
将工作区的“新建/修改”添加到暂存区
-git add .
将工作区的被修改的文件和新增的文件提交到暂存区,不包括被删除的文件
-git add -A
A指all,将工作区被修改、被删除、新增的文件都提交到暂存区 -
提交
-git commit -m [massage]
将暂存区所有文件添加到本地仓库
-git commit [file-name-1] [file-name-2] -m [massage]
将暂存区指定文件添加到本地仓库
-git commit --amend
用于将本次提交和上次提交合并为一次提交,执行命令之后会进入vim编辑模式,用于编辑合并提交的massage -
推送
git push
将文件添加到远程仓库
git push -f
强制推送,当我们本地reset到旧的版本时,然后普通push会被拦截,因为回退之后本地HEAD指向比远程库还要旧,需要用强制推送才可以推送到远程仓库
git push origin [branch-name]
推送当前本地分支到指定远程分支 -
查看历史记录
git log
查看提交历史记录,显示如下图,会展示提交的详细历史记录,包括每次提交的全commit id,分支所在版本,作者,日期,提交信息
git log --pretty=oneline
,git log --oneline
这两个命令都是展示简略的提交历史记录,这两个的区别在于前者是显示全commit id,后者显示局部commit id
git reflog
查看操作历史记录,显示如下图,其中会包括 HEAD@{移动到当前版本需要多少步},此命令可以查看回退所丢失提交版本的commit id,用于回退的找回
-
切换
git checkout -- [file-name]
用暂存区的文件覆盖掉工作区的文件 -
回退
git reset --参数 [commit id]
将代码回退到指定版本处,参数包括soft ,mixed(推荐),hard。若远程仓库中的代码版本比本地回退之后的版本新,可用git push -f
命令进行强制推送。
–soft 参数:仅仅在本地库移动 HEAD 指针
–mixed 参数: 在本地库移动 HEAD 指针,重置暂存区,配合命令6可完成保留指定内容的保留和回退
–hard 参数: 在本地库移动 HEAD 指针,重置暂存区,重置工作区使用hard参数回退所删除的代码可找回 (注:删除前,文件存在时的状态必须提交到了本地库)。具体操作见示例:
假设我现在的版本为1111111,我进行了代码修改并提交了修改代码后的新版本为2222222,然后我使用命令git reset --hard 1111111
回退到了上个版本,我现在突然不想回退了。
当前git reflog
获取的操作记录如下:
1111111 HEAD@{0}: reset: moving to 1111111
2222222 HEAD@{1}: commit: 因回退删除的版本
1111111 HEAD@{2}: commit: 原版本
找回的操作步骤:
1. 首先使用git reflog
命令获取操作记录,查找到本次回退所误删的commit id为222222
,
2. 使用命令git reset --hard 222222
即可找因这次回退而误删的代码 -
比对
git diff [file-name]
将工作区中的文件和暂存区进行比较
git diff [commit-id] [file-name]
将工作区中的文件和暂存区进行比较
2、分支管理
git fetch
更新本地仓库git checkout -b 本地新分支名 orgin/远程新分支名
将远程的新分支拉到本地并创建一个新分支- 存放
git stash
将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录
git stash list
查看当前stash中的内容
git stash pop
将当前stash中的内容弹出,并应用到当前分支对应的工作目录上
git stash apply
将堆栈中的内容应用到当前目录,不同于git stash pop
,该命令不会将内容从堆栈中删除,也就说该命令能够将堆栈的内容多次应用到工作目录中,适应于多个分支的情况命令3一般用于
1.当前分支正在开发,需要临时切换到其他分支进行其他操作(比如bug修复)但是又不想commit的情况,可以用git stash将内容保存起来,切到bug修复分支操作后,再次切回开发分支恢复内容即可。
2.误在master上进行开发,需要将已开发的内容搬到dev分支上去,可以用git stash将内容保存起来,切到dev分支后,再次恢复内容即可。 git merge [branch-name]
将目标分支代码合到当前分支上git rebase [branch-name]
将当前分支以目标分支代码为基础变基merge和rebase命令都有合并的代码的功能,区别在于merge命令合并代码时会产生新的提交,且提交记录的顺序不会发生改变,而rebase命令不会产生新的提交,且提交记录可能会发生改变,但分支树结构会变得很整洁。笔者建议如果你没有代码洁癖,尽量使用merge,因为保证分支树的最初形态方便梳理提交记录以便查找问题或者回退
git switch [branch-name]
切换到目标分支git branch -f [origin-branch-name] [target-branch-name]
将原分支强制更新为目标分支版本,包括历史记录也会被修改为和目标分支一致git cherry-pick [commit-id] [commit-id] [commit-id]...
检出所选提交版本id并按顺序提交到当前分支上
三、其他学习git比较好的文章地址:
- 廖雪峰Git教程
- 菜鸟教程
- git小游戏