一、仓库初始化
git init # 当前路径也是工作区
git -bare init
二、跟踪和提交操作
git add # 将文件跟踪起来,加入到暂存区中
git commit # 将暂存区提交本地版本库
git commit -a # 将本地工作区中的被修改文件(已跟踪状态的)都提交到本地版本库中(当然是先添加到暂存区,后提交本地版本库中)
三、分支操作
1.增删查
git branch # 查看本地分支
git branch new_branch # 新建本地分支
git checkout dev # 切换分支到dev
git checkout -b mywork master # 基于master分支,新建分支并切换到分支mywork
git branch -d dev # 删除那些被当前分支合并的分支
git branch -D dev # 强制删除分支
2.改(分支合并)
git merge dev # 合并dev分支到当前所在分支
git commit -a # 解决冲突后,提交
四、查看历史操作
git log 文件名 # 查看commit的历史记录
git log --pretty=oneline # 只显示版本号和提交信息
# git log 无法查看被回退的commit信息
git reflog # 查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
git show <commit-hash-id> # 查看某次commit的修改内容
五、比较操作
git diff # 比较文件在暂存区和工作区的差异
git diff --cached # 比较文件在暂存区和本地仓库的差异
git diff HEAD # 比较文件在工作区和本地仓库的差异
git diff branch1 branch2 文件名 # 比较任意两个分支的某个文件的差异 ,通过git branch -a 查询所有分支名
$ git diff
diff --git a/test.txt b/test.txt
index 753ad01..d9eff2d 100644
--- a/test.txt
+++ b/test.txt
@@ -1,3 +1,4 @@
123123
isdfsd
sdfds
+sdfds
第一行:diff --git a/test.txt b/test.txt ,git diff实质上用的是diff的文本比较工具,其中a/test.txt代表源文件,也就是修改前的文件, b/test.txt代表比目标文件,也就是修改后的文件;
第二行:index 753ad01..d9eff2d 100644 , index后面两个字符串表示两个文件的hash值,最后的数字是文件的权限和属性(?);
第三四行:---代表源文件,+++代表目标文件;
第五行:差异小结,@@ -1,3 +1,4 @@ ,分为两个部分,第一个是-1,3,-表示源文件,1,3表示从第一行开始的三行,后面的+1,4,则表示目标文件的第一行开始的四行内容。差异小结可能会有多个。
剩下的行都是具体的差异信息,其中以空格开头的行代表源文件与目标文件没有差异,以-开头 的行代表在源文件的基础上删除,以+开头代表在源文件基础上添加;
六、版本回退
1.总命令
git reset [--soft | --mixed | --hard] [HEAD]
--mixed 为默认,可以不用带该参数。用于重置暂存区,和上一次的提交保持一致。
2.暂存区回退
git reset # 默认回退暂存区
git reset HEAD^ # 回退所有内容到上一个版本
git reset HEAD^ hello.php # 回退 hello.php 文件的版本到上一个版本
git reset 052e # 回退到指定版本
3.本地仓库一次回退(回退commit操作,将本地仓库的内容回退到暂存区,并且已经add的状态)
git reset --soft # 用于回退到某个版本
git reset --soft HEAD~3 # 回退上上上一个版本
4.硬回退(回退文件到指定版本,回退本地仓库、暂存区、工作区的文件到指定提交,之间的代码会丢失)
git reset --hard # 将暂存区与工作区都回到上一次版本,并删除之前的所有信息
git reset --hard HEAD # 重置工作区和暂存区到 本地版本库的当前版本
5. 回退当前工作区内容
git status # 查看本地修改 git checkout -- 文件名 # 取消具体文件修改到最近一次提交(提交到暂存区之前的修改) git checkout . # 取消所有文件修改到最近一次提交(提交到暂存区之前的修改) git stash # 撤销修改 git stash apply # 将修改应用到工作区中
6. 本地仓库两次回退(保留代码到工作区,回退add和commit操作)
git reset --mixed commitid
七、远程仓库相关操作
git remote -v # 查看远程仓库信息
git remote add origin 远程仓库链接.git(注意后面要+.git) # 连接远程仓库
git push -u origin master # 推送本地仓库到远程仓库,首次提交需要使用完整命令
git pull -u origin master # 拉取远程仓库到本地仓库
# 包含了两个操作
git fetch -u origin master 分解命令1 # 第一个操作是拉取origin上的master分支到本地分支上
git merge origin/master 分解命令2 # 第二个操作是合并origin的master分支到本地分支上,如有冲突得手工解决
八、文件状态查看
git status -s # 简易查看文件状态信息
# 输出标记会有两列,第一列是对staging区域而言,第二列是对working目录而言。都是以本地版本库为参考
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
# (use "git push" to publish your local commits)
#
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: test.txt
#
# 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: test.txt
#
$ git status -s
AM test.txt
九、查看GIT配置参数
git config -l
十、clone操作
git clone 只能clone远程库的master分支,无法clone所有分支,解决办法如下: git clone http://github.xxx.com/project/.git #克隆远程master分支到本地 git branch -a # 查看远程分支名称 git checkout -b dev origin/dev # 检出远程分支origin/dev到本地,并命名为dev分支
git checkout dev # 切换到dev分支
十一、refs引用(参考文献之意)
引用(Refs)是一种间接引用commit的方式。它是一种对用户来说更亲和的commit哈希的别名。使Git表示分支与标签的内部机制。
除了commit,其余都是引用
.git/refs/
heads/ (本地分支)
master (master分支的最新commitid)
some-feature
remotes/
origin/
master
tags/
v0.9
git show refs/heads/some-feature 同 git show some-feature ,不过前者更完整。为了区分是heads还是tag
git rev-prase master 可解析出最新的master的commitid
十二、refspecs(本地仓库到远程仓库的映射)
refspecs被表示为[+]<src>:<dst>。<src>参数表示本地仓库的分支,<dst>参数表示远程仓库的目标分支,可选参数+表示是否让远程仓库执行non-fast-forward更新
Refspec可与git push命令联合使用来为远程分支添加不同的名字
git push origin master:refs/heads/qa-master 推送本地分支master到 远端 并命名为 qa-master
git push origin :some-feature 删除远程分支some-feature
通过添加几行代码到Git配置文件中,你可以使用refspec来改变git fetch命令的行为:
[remote "origin"]
url = https://git@github.com:mary/example-repo.git
fetch = +refs/heads/*:refs/remotes/origin/*
修改为:
[remote "origin"]
url = https://git@github.com:mary/example-repo.git
fetch = +refs/heads/master:refs/remotes/origin/master
十三、相对引用
~ 追踪 原生父亲 引用
^ 追踪 再生父亲 引用, HEAD^1表示原生父亲,HEAD^2表示再生父亲,HEAD^N,N表示几级父亲。
git show HEAD^1 -- 原生父亲,第一级父亲,等同于git show HEAD~1
git show HEAD^2 -- 再生父亲,第二级父亲
git show HEAD^2^1 -- 再生父亲的父亲。原head的祖父级
十四、特殊引用
存在于.git目录下的顶部
HEAD – 当前检出的 commit/branch. --当前head指向 FETCH_HEAD – 最新从远程仓库获取的分支。 --所有远端分支的最新commitid记录 ORIG_HEAD – 作为备份指向危险操作前的HEAD。 MERGE_HEAD – 使用git merge命令合并进当前分支的提交。 CHERRY_PICK_HEAD – 使用git cherry-pick命令的提交。
十五、恢复本地操作
reflog是Git的安全网,其中记录了基本上所有的本地仓库中的改变,不论你是否提交了快照。
git reflog 400e4b7 HEAD@{0}: checkout: moving from master to HEAD~2 0e25143 HEAD@{1}: commit (amend): Integrate some awesome feature into `master` 00f5425 HEAD@{2}: commit (merge): Merge branch ';feature'; ad8621a HEAD@{3}: commit: Finish the feature
通过HEAD{<n>}语法你可以引用存在reflog中的提交。这与之前章节的HEAD~<n>有着相似的用法,但<n>引用reflog中的记录而不是commit历史中的记录
你可以使用此方法回滚在别的记录中丢失的状态。例如,刚用git reset
删除一个特性后,你的reflog会像下面这样:
git reset HEAD~3 -- 从当前分支上移除最近三次提交 git reflog ad8621a HEAD@{0}: reset: moving to HEAD~3 298eb9f HEAD@{1}: commit: Some other commit message bbe9012 HEAD@{2}: commit: Continue the feature 9cb79fa HEAD@{3}: commit: Start a new feature
回退上面的操作 git checkout HEAD@{1}
十六、关联本地仓库与远端仓库
1 解析是否存在.git目录 git rev-parse --resolve-git-dir .git 2 if [[ $? -ne 0 ]] ;then git init;fi 3 配置远端git url : git config remote.origin.url git@仓库 4 git fetch --process --tags git@仓库 +refs/heads/*:refs/remote/origin/* 5 获取commitID git rev-parse refs/remotes/origin/分支名^{commit} 6 检出远端分支 git checkout -f origin/分支名 7 单层检出 git fetch --tags --force --progress --depth=1 -- git@仓库 +refs/heads/*:refs/remote/origin/* 8 合并操作 git merget --no-ff 原分支commitID -m "11111"
十七、创建空白分支
1 2 3 4 | git checkout --orphan 新分支名 # 新建一个没有提交历史的新分支,但包含父分支的所有文件 git rm -rf . # 删除当前分支的所有文件 接着可以新建文件,然后提交本地仓库 git push origin 新分支名 # 提交新分支到远程仓库 |
十八、操作特定文件
git 操作 -- 文件名
如: git log -- 1.txt 查看1.txt文件的历史提交
git checkout -- 1.txt 拉取到最新的提交
提交及回退操作如上图所示
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示