Git常用命令
A区代表工作区,B区代表暂存区,C区代表本地仓库
git init 在当前目录下生成Git仓库
git clone [url] 在当前目录下克隆一份git代码
git clone [url] 目录F 自定义本地仓库的名字 该种方式会自动在本地添加一个名为origin的远程仓库,以及自动在本地创建master分支与远程仓库中的master关联,push时 git push即可
git add 目录F/文件f # 将当前目录下F/f添加进A区
git status -s 以一种紧凑的格式输出当前文件的状态
有以下几种字母代表的状态
A:刚刚添加到B区的文件,
??:尚未添加进A区的文件
M:M有两种可能出现的位置,第一个位置的M为C区与B区的文件不一致,第二个M代表C区与A区不一致
.gitignore文件中为忽略纳入git管理的文件种类,
git diff 查看A区与B区文件的差别,该命令所有形式后面可跟具体文件名,以进行针对性比较,下面同理 git diff --cached/staged 查看B区与C区文件的差别
git diff HEAD 显示A区与C区文件的差别 HEAD为C区最新文件,HEAD~n 1位最新状态2次之,依次排序.
git diff branch1 branch2 比较两分支之间C区的差别
git diff branch1 branch2 -stat 比较两分支之间C区的差别的简略版本
git commit -am '备注信息' 直接将A区文件同步至B区及C区,并非跳过B区直接更新C区.相当于add + commit
git rm 目录F/文件f 将目录或文件从A区B区删除,相当于rm + git add.执行该命令时必须保证目录F/文件f在ABC三区完全一致,否则报错(加-f可强制删除AB区文件,如果后悔可用restore恢复)
$ git rm ax.txt # B区C区一致,A区与BC区不一致 error: the following file has local modifications: ax.txt (use --cached to keep the file, or -f to force removal)
$ git rm ax.txt # 1.A区C区一致,B区与AC区不一致2.A区B区一致,C区与AB区不一致都会产生相同的错误
error: the following file has changes staged in the index:
ax.txt
(use --cached to keep the file, or -f to force removal)
git rm --cached 将目录或文件从B区删除
git mv file_a file_b 将B区文件file_a改名至file_b 等价于 mv file_a file_b + git rm file_a + git add file_b
git log 根据提交时间由近到远显示提交历史 更多格式
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number</span></pre>
$ git log -p -2 # -p 显示每次提交的内容差异 -2 最近的两次
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = "simplegit"
- s.version = "0.1.0"
- s.version = "0.1.1"
s.author = "Scott Chacon"
s.email = "schacon@gee-mail.com"
s.summary = "A simple gem for using Git in Ruby code."
$ git log --stat # --stat 每次提交的简略信息
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
Rakefile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
$ git log --pretty=oneline # --pretty 这个选项可以指定使用不同于默认格式的方式展示提交历史,比如用online将每个提交放在一行显示
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
git commit --amend 该操作为修改最近的一次提交.更改上次的提交信息那么直接运行该命令然后在弹出的编辑框中修改提交信息保存即可,
修改提交的内容,可以先修改好内容,然后git add
,再使用git commit --amend
,填写commit信息保存即可并且该次提交会替换上一次提交
git reset HEAD 文件f 该操作会将C区文件f反向更新至B区 --hard则更进一步更新至A区(该操作较危险),已被restore代替
git checkout -- 文件f 该操作会将B区文件f反向更新至A区 (该操作较危险),已被restore代替
git store 文件f 该操作将B区文件f更新至A区,注!该命令会将更新区的文件与源区的文件对齐,即如果源处与更新处文件数量不一致,更新后以源处为准(更新处可能会删除或者新增一些文件)
git restore hello.py 一般格式,将B区文件更新至A区,可添加指定源--source,如果给定,则内容将从该源处还原,否则从B区还原.--worktree为默认模式即将文件更新至A区
git restore --staged hello.py 将C区文件更新至B区,可添加指定源
git restore --source=HEAD --staged --worktree hello.py 将当前C区的文件更新至A区与B区,--staged可简写为-S,--worktree可简写为-W,--source可简写为-s
git restore -s@ -SW hello.py 上述命令简写版本
git restore -s HEAD~1 hello.py 将C区上个版本中的文件更新至A区
git restore -s commit_id hello.py 将C区指定版本中的文件更新至A区
git restore '*.c' 将B区所有c文件更新至A区
git restore . 将B区所有文件更新至A区
注 Git 中任何 已提交的 东西几乎总是可以恢复的。 甚至那些被删除的分支中的提交或使用 --amend
选项覆盖的提交也可以恢复。 但是任何你未提交的东西丢失后很可能再也找不到了。
git branch 查看当前所有分支 -a所有分支 -r远程分支 git branch 分支k 创建分支k
git branch --set-upstream 分支k 远程名称/分支c 建立本地分支k和远程分支c的关联,简化git push/pull 远程名称 远程分支:本地分支 为git push/pull git switch 分支k 换到分支k git switch -c 分支k 创建并切换到分支k
git switch -c 分支k 远程名称/分支c 从远程拉取分支c到本地作为分支k创建,本地和远程分支的名称最好一致 git branch -d 分支k 删除分支k 注!对于所有分支而言, A区B区是共享的.所以在切换分支时最好保证当前分支ABC三区一致,如果实在不能保持一致也不能在切换后对原分支中改动文件进行commit,
否则原分支的改动会被合并到现有分支中,再切换回原分支则所有改动就会消失.(或者stash也可以临时保存一下)
git merge 分支k 该命令会将分支k中的改动合并到当前分支中来,如果当前分支与分支k有分叉需要手动更改冲突然后 add+commit提交即可生效.
如果没有分叉则执行fast-forward合并,即仅将当前分支的指针移动到分支k上,注:该情况是针对当前分支没有更新而分支k上有改动的时候.此时merge的结果会同步到ABC三区,另进行merge前ABC三区必须一致否则失败.
git stash 它会将AB区的改动隐藏至一个堆栈中,该命令执行完后ABC三区一致 git stash save 'balabala...' 可以添加一些注释 git stash list 查看所有隐藏, stash@{id} 为每个隐藏的id id越小距离目前越近,0为最近一次的隐藏 git stash apply stash@{id} 恢复指定一次隐藏至现有AB区,默认为最近一次,即id为0 git stash pop stash@{id} 弹出指定一次隐藏至现有AB区,默认为最近一次,即id为0.注每清除一次隐藏后,stash的id会自动从0开始重新排序,下同
git stash drop stash@{id} 删除指定一次隐藏,默认为最近一次,即id为0 git stash clear 清空所有隐藏
git cherry-pick commit_id 将commit提交的改动"复制"到当前分支并提交
git remote add 远程名称 git@github.com:用户/项目.git 该操作是关联一个远程仓库到本地,远程名称可以任意指定一般默认origin.它只是远程仓库的一个别称,你甚至可以添加多个不同名称但是git地址相同的关联 注:第一次使用HTTPS格式提交代码到远程仓库时,github会要求你提供用户名和密码,而密码则是github的个人访问令牌需要在github个人页面的设置中生成,生成该令牌时可设置令牌权限范围及时效
git remote -v 查看本地仓库与当前远程链接链表
git remote set-url 远程名称 http://github.com/用户/项目.git 将远程url从ssh切换到https
git remote set-url 远程名称 git@github.com:用户/项目.git 将远程url从https切换到ssh
git remote rename 远程名称A 远程名称B 重命名远程库的名称
git remote rm 远程名称A 删除远程远程库与本地的链接
git push 远程别称 本地分支a:远程分支b 向远程仓库的远程分支提交本地分支的代码,以下以origin a b分别代替 git push -u origin 本地分支a:远程分支b 将分支a与分支b关联(一般情况下两个分支名称相同),
git push origin 本地分支a 该命令可能导致以下几种情况:在远程仓库创建或更新分支a
git push 提交当前分支的代码到关联的远程分支
git push --force 强制将本地分支代码更新到关联分支上去,会覆盖或删除一些本地没有的代码文件.最终远程分支代码内容与文件数与本地分支一致.
git push 远程别称 --delete 远程分支a 删除远程分支a,如果分支a为默认分支则无法删除,可以尝试更改默认分支再进行此操作
git push 远程名称 :远程分支a 删除远程分支a,不过该种方式是通过push一个空的分支来覆盖分支a,以达到删除远程分支a的目的.同样该命令也无法删除默认分支
git rebase 分支a 假设当前分支为分支k,该命令一般用作改变分支k的起点,就是将分支a与分支k的差异提交获取到,然后在分支a的最新提交点后面将差异(属于分支k)逐个提交,最后将分支k的HEAD指针指向最新的提交点
注分支a的位置,提交前它在什么位置提交后仍然在什么位置.不过此时就可以将分支k merge到分支a上,并且满足fast-forward条件.即此时向分支a merge时会直接将分支a的指针移到分支k上
该命令还可写作git rebase 分支a 分支k(如果当前所在分支不是分支k的话).参考 图解 Git 基本命令 merge 和 rebase - Michael翔 - 博客园 (cnblogs.com) rebase 操作
git rebase -i HEAD~3 修改前三次commit的提交结果,或合并或交换位置取决于后序具体参数.
注:git rebase操作时,git会撤销当前最近几次提交(取决于rebase涉及到多少个commit),每当有冲突需要更改文件时然后add 然后continue时都会将这次改动更新到commit中去,体现在合并/互换commit以及pull时
比如互换两个commit时发生冲突(master|REBASE 1/2),git会让你手动解决冲突文件然后add + continue (此时continue相当于commit)后填写提交信息,这就提交了倒数第二个commit到本地,此时git提示你(master|REBASE 2/2)
之后再需要手动解决冲突再add 再continue 填写提交信息最后作为最后一次commit提交上去.至此完成commit的互换 更多详细用法参考
git tag 标签名称 对当前分支添加一个标签名称,默认是打在最新提交的commit上的 git tag -d 标签名称 删除标签列表中的指定标签 git tag 标签名称 commit_id 对指定commit进行标注 git tag -a 标签名称 -m '标签信息' 可在打标签的同时添加标签信息 git show 标签名称 查看该标签的具体信息
git push 远程名称 标签名称 推送一个本地标签到远程
git push 远程名称 --tags 推送全部未推送过的本地标签到远程
git push 远程名称 -d/--delete 标签名称 删除远程标签
git push 远程名称 :refs/tags/标签名称 该操作同删除远程分支原理一致
git fetch origin master 该命令会将origin的master同步到本地仓库的origin/master,在进行merge前可利用git diff origin/master 查看不同点.
git fetch origin 将origin的所有分支同步到本地的远程分支中来
git fetch 将本地关联的所有全程的所有分支同步到本地的远程分支中来,
git pull 执行该命令时必须指定当前分支的关联分支,否则无效.该命令等于 git fetch + get merge 1.先对当前分支执行git fetch 2.对当前分支执行git merge origin/关联分支
git pull origin branch1:branch2 该命令为拉取origin上的branch1分支更新到本地origin/branch1上,然后对当前分支做merge.注!如果branch2不是当前分支则branch2无效最终命令为git pull origin branch:当前分支.
因为merge时是以当前分支作为被合并对象的.如果branch1为空则默认为远程主分支,所以一般该命令可简写为git pull origin 远程分支,此时pull对象为当前分支
git pull --rebase origin 远程分支a 他与普通pull的区别在于不使用merge来合并远程分支到本地而是使用git rebase
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下