git 命令实战操作
- 移除现有的远程连接: git remote remove origin
# ====== 配置
配置用户姓名:git config --global user.name "封兴旺"
配置用户邮箱:git config --global user.email "2967790283@qq.com"
查看当前用户配置:git config --global --list (user.name=封兴旺 user.email=2967790283@qq.com)
# 生成ssh密钥
ssh-keygen -t ed25519 -C "fxw ssh" // 全部回车
ls ~/.ssh/ // 查看是否生成
cat ~/.ssh/id_ed25519.pub // 查看并复制公钥文件到 git
#=====
1. 获取最新状态:
获取全部的状态: git fetch origin # 如果远程有分支被删除了可以加 git fetch --prune origin
获取特定分支的:git fetch origin your-branch # 注意这里不是 origin/your-branch
2. 比较差异:git diff origin/your-branch(当前分支和远程分支) 或者 git diff your-branch origin/your-branch(自定义分支和远程分支)
3. 合并差异:git merge origin/your-branch
当然为了简化操作直接:git pull origin 或者 git pull git merge origin/your-branch
4. 远程有新分支,直接这样同步就可以了: git checkout -b new_t2 origin/new_t2
#======= 查看某个提交点的数据
git log
:'方式1:这样会创建一个临时分支,如果你在此基础上修改了内容
1. 另起一个提交分支 git checkout -b new-branch, 然后提交新的分支
2. 另起一个临时分支 git checkout -b temp-branch 然后合并的你需要的分支:git checkout master ; git merge temp-branch
最后可以把临时分支删除了:git branch -d temp-branch // 删除本地分支及远程分支的引用:git branch -r -d origin/branch-name , 删除远程:git push origin -d temp
'
git checkout 0e18f49e9fb99dc0c871a356cfad8bab2501c325
看完信息之后要回去就直接 git checkout master 就可以了
#方式2,老伙计了就不描述了
git reset --hard 0e18f49e9fb99dc0c871a356cfad8bab2501c325
# 子模块
:'
新建一个目录ts_su2,然后把 git@gitee.com:fengxingwang/test.git 仓库里的 f1_su 分支拉取到 ts_su2 目录
但是不支持 --single-branch 参数, 所以把仓库的分支都拉取过来了
'
git submodule add git@gitee.com:fengxingwang/test.git ts_su2
# git submodule add -b f1_su git@gitee.com:fengxingwang/test.git ts_su2
# 此时可以 cd 到个子模块,然后执行 pull、push 等 git 操作。
# 当然也可以使用官方提供的一些操作子模块的方法如下 ================= :
# 新建 .gitmodules 文件,会自动记录已存在的字模块信息,里面有一些设置,如只更新子模快的某个分支
touch .gitmodules
# 根据 .gitmodules 文件的配置 更新全部的子模块 ,
# --init:初始化子模块。这会读取 .gitmodules 文件中的配置,并为每个子模块创建必要的 Git 目录结构。如果没有 --init 选项,Git 只会更新已经初始化的子模块
git submodule update --init --remote
# 根据 .gitmodules 文件的配置只更新 ts_su2 子模块
git submodule update --init --remote ts_su2
git ls-tree -r HEAD: 查看当前管理的条目 // -r 看的更详细
git 修改本地分支名 并 远程同步修改
1. 首先,确认你当前不在你打算修改的分支上
2. 修改本地分支名称: git branch -m old-branch new-branch
3. 切换到刚修改的分支: git checkout new-branch
4. 远程仓库中删除旧的分支: git push origin --delete old-branch
5. 推送新分支到远程仓库: git push -u origin new-branch // 这里的-u标志会设置本地分支new-branch跟踪远程的new-branch
其它命令补充:
1. 删除本地分支:git branch --delete aa
在主分支(m分支):git merge m2
m2 添加了新文件,m会直接添加过来(包括commit); 删除文件也是,m直接删除,并添加 m2 的删除文件的commit
m2 在a.txt里追加了新内容,m直接添加过来(包括commit)
m2 在b.txt 删除b1,添加b2, master直接全部同步(像复制似的,m自己的 b1 也删除了)
m在b.txt里第3行添加b3, m2在b.txt第3行里添加b4,此时出现冲突,让你选当前的b3还是m2的b4,假设选择b3:
假设选择b4:
所谓合并就是把commit 都整合过来,如果冲突了就选择要保留的再新增commit
拉取单分支后,可以 git checkout -b 1.1.9 接着其它的都可以删除了,留个 .git , 然后 git pull origin 1.1.9, 这样就是多个分支了
本地目录上传到远程仓库:git init -- git checkout -b 5-opencv -- git add . -- git commit -m "vs2022 initit" -- git remote add origin https://gitee.com/fengxingwang/win_c.git -- git push -u origin 5-opencv (首次推送记得加上 -u
或 --set-upstream
标记,以便设置追踪关系)
忽略 .vscode/ 没有效果:那是因为之前已经提交过了,所以要先从版本库中删除 git rm -r --cached .vscode
远程新建分支了,本地拉取:git fetch -> git checkout -b 1_opencv origin/1_opencv
创建并转到干净的分支a,没有提交记录,但是之前分支的文件还在,要手动删一下 rm -rf *: git checkout --orphan=a
强制切换到新的分支: git checkout -f new (git checkout --force new)
基于当前的分支创建并转到:git checkout -b aa | git branch aa
很长时间没有使用 git 了故重新写一遍关于 git 操作相关的随笔,如果有些不是很明白的可以先看 Git下载安装及使用(码云) - 封兴旺 - 博客园 (cnblogs.com)
1. git init -> touch f.txt -> git add . -> git commit -m "null" -> git push git branch newBran -> git checkout newBran ->
rm null.txt (这一步其实应该直接 git reset --hard 最底的commitID 一了百了(git log --reverse 可以开头就看到最开始的commit id), 或者在空的主分支创建子分支然后切过去) ->
git 复制文件操作 -> git add . -> git commit -m "ts" ->
git clean -fd(push 前删除 不被git 管理的 空目录, 可以先执行git clean -fdn 确任一下要删除的是不是空目录)-> git push orgin newBran
git clone https://***** || git clone -b master --single-branch https://gitee.com/fengxingwang/ffmpeg.git(只复制master 单分支)
git git branch -a // 默认下载的是主分支,这个查看所有分支 -r 之查看远程分支
git fetch origin videoPlay:videoPlay // 拉取远程的videoPlay分支到本地的videoPlay分支(本地没有videoPlay分支会自动创建) pull = fetch + merge 不仅会合并指定分支,还会合并当前分支
有时候远程分支更新了你需要 git fetch 获取一下远程服务器的索引 或者git remote update origin --prune命令更新,再使用git branch -a(r)查看才出现
所以建议第一次使用git fetch origin videoPlay:videoPlay 后面更新使用 git pull origin videoPlay:videoPlay (切换到当前分支(vdeoPlay)使用, 其实第一次也可以直接用 pull,但是要新建分支并且切过去)
ts.txt文件修改后变红了怎么撤回:git checkout master.txt // 这样状态和内容又恢复了,没错切换分支也是它,它有更新的功能。 有时候报错未合并的,先 git reser aa.txt
add 之后撤回:git reset HEAD // 后面什么都不加,就是全部撤销,也可以 git reset HEAD ts.txt, 撤销 add 但是修改的内容不变(因为是默认参数 --mixed)
commit 之后测回:git reset --hard HEAD^ | commitID | hardId // --hard 删除改动代码,撤销commit且撤销add; --mixed 不删除改动代码,撤销commit,并且撤销git add (默认参数); --soft 不删除改动代码 ,撤销commit,不撤销add; git commit --amend 修改注释
// HEAD^ 表示上一个版本,即上一次的commit,几个^代表几次提交,如果回滚两次就是HEAD^^。也可以写成HEAD~1,如果进行两次的commit,想要都撤回,可以使用HEAD~2。
// push 的时候加个 -f 强制推送 git push -f origin aa
git branch -D aa // 删除本地分支
git push origin --delete aa // 删除远程分支
// ======================== 7/19
git show commitID // 查看提交的内容;git log -p 也可以查看提交内容是所有的; git log --onelie 每条日志显示一行; git log --after=“2018-7-1” 看2018年7月1号之后的所有日志;
git log --grep=“issue" 按照提交信息,看是否包含issue的日志;git log -S “ngx_ free" 按照内容,即所有文件中包含了ngx_ free字符串的修改;git log --author=“Dounin” 按作者
git reset --hard commitID // 退出到指定的版本预览内容 -> git reflog // 现在想恢复了,先看下操作记录,找到上一个操作记录的hardID -> git reset --hard haedID
合并commit
git rebase -i 8ae7717 // 合并commit,这里的58e02f3是你要合并的最底的commitID再前一个
按回车
保存完后,修改注释,把其它注释都删除或者都加# ,留第一个想咋写就咋写,我写的是 ts5和ts4合并到ts3。然后看下效果:
最后提交一下:git push -f origin ts || git push --force origin ts
// linux 编译的时候 ctrl + x -> y -> 回车
其它人pull的时候: git fetch origin (获取远程分支的最新状态) -> git reset --hard origin/3-PUAS共享系统 (将本地分支重置为远程分支的状态)
- 终止:git rebase --abort
- 继续:git rebase --continue
- 补充:
git add 忽略某些文件
配置忽略规则(支持正则, 注意要 add 和 commit .gitignore 文件):
touch .gitignore # 忽略项目根目录下所有以 .a 结尾的文件 *.a # lib.a 除外(也就是说,除了lib.a文件外,项目根目录下其他文件或目录均被忽略) !lib.a # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO(就是说如果其他目录下有同名的目录,那与下面指定的是没关系的) /TODO # 忽略 build/ 目录下的所有文件(如果远程仓库也没有build目录,该目录也不会被推送,因为此时相当于空目录,空目录无法推送) build/ # 忽略项目根目录下的 doc 目录下的所有以 .txt 结尾的文件,但不包括 doc/server/*.txt doc/*.txt # 忽略foo文件夹及其所有子文件夹中的.log文件 foo/**/*.log # 忽略node_modules文件夹中以及里面的所有文件 =========== 这个最常用 node_modules/*
# 整个项目中忽略所有名为a的子目录,无论它们位于哪个层级
**/a/
# 但是不忽略node_modules文件夹本身 !node_modules/ # 忽略vendor文件夹 vendor/ # 但是不忽略vendor/assets文件夹 !vendor/assets/ # 忽略.idea文件夹 .idea/ # 但是不忽略.idea/codeStyles文件夹 !.idea/codeStyles/
.gitignore 只能忽略那些原来没有被 track 的文件(已经 add 了的文件,是被跟踪状态,要先把本地缓存清掉),如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。解决方法就是先把本地缓存删除(git rm -r --cached . 改变成未 track 状态),然后再提交(重新 add 这些)。
git忽略文件不起作用:
有时候,在.gitignore文件中定义的规则不起作用,导致被忽略的文件或文件夹仍然出现在Git仓库中。这通常是因为.gitignore文件没有被正确地添加到Git仓库中,或者被另一个.gitignore文件所覆盖。以下是一些排查方法:
1. 确认.gitignore文件是否已经添加到Git仓库中:git status 如果.gitignore文件未被追踪,执行以下命令将其添加到Git仓库中:git add .gitignore -> git commit -m "add .gitignore file"
2. 确认.gitignore文件中的规则是否正确。建议使用绝对路径来定义规则,避免相对路径带来的问题。并且建议在.gitignore文件中添加注释,方便他人理解。
3. 确认是否有其他.gitignore文件所覆盖。如果有多个.gitignore文件,Git会将其合并,如果有重复的规则,则后面的规则会覆盖前面的规则
git diff:
1. 我写了一些代码,使用 < git status > 看肯定是红色了,在 < git add . > 之前我想看一下我写的代码和之前比起来有什么区别,可以使用 < git diff || git diff main.cpp(指定比较文件,默认是当前分支) || git diff master(当前分支) > 然后再决定要不要 add 。
2. 然后我 add 并且 commit 完了之后 想看一下 我本地的 代码和 gitee 上的有什么区别可以使用 < git diff origin/master || git origin/master master >,这个命令只比较你 commit 之前的代码,如果你没有 commit 就不比较。
3. 以上查看差异的代码后面加上 --full-index > ts1.diff ,就可以把你看到的差异log信息输出为一个文件,比如 git diff --full-index > ts1.diff || git diff origin/master master --full-index > ts2.diff
4. 使用差异文件(打补丁):首先看一下我们的 git status 状态时良好的。然后把补丁文件( .diff )复制到 .git 目录下,然后可以使用 git apply --check ts1.diff 先检查一下(没输出 说明没问题),没问题后我们使用 git apply ts1.diff,完了后会发现我们的文件按照 ts1.diff 的要求同步了(ts1.diff可以删除了或者移动到别的地方),git status 看一下, 再 git diff 看一下,没问题就 git add . 有问题就 git reset --hard <最近的id>
git stash (stash 英译为隐藏 把代码藏起来,藏到git栈里):
1. 使用 stash 首先 git status 看一下暂存区有没有还没提交的文件 (不管是红色的(还没提交到暂存区)还是绿色的(还没提交到本地仓库) 都是没有提交的。都提交了最后会显示 nothing to commit, working tree clean(无需提交,工作树干净)。都提交了你使用 git stash 的话会提示 No local changes to save),如果有没有提交就提交干净。
2. 现在你开始写代码,写呀写,然后发现你写的这些东西可能暂时不会被用到。那你现在是要把它都退回吗?或者单独保存一份?其它你还可以这样输入 < git stash save "2022-10-28 这些代码我先保存到git栈里吧" > 完了之后你会发现此时你的代码就自动退回到上一次提交到本地仓库的那个样子了。 那你就有点慌,不过也没关系你可以输入 < git stash list > 可以看到git栈里的所有的stash记录,然后在输入 < git stash apply stash{0} // 这个0你要根据自己的情况选择 > ,完了就会发现代码又恢复了。 当然你也可以删除某个个stash < git stash drop stash{0} > , 也可以清空所有的stash < git stash clear >
3. 其它命令:git stash pop (退回到并删除第一条 stash);git stash show ( 查看堆栈中最新保存的stash和当前⽬录的差异)
git pull :
1. 介绍:git pull 它可以把gitee某个分支的更新部分下载下来,再和本地指定的分支合并。git pull = git fetch + git merge。git pull <远程主机名> <远程分支名>:<本地分支名>
2. 示例:git pull origin master:brantest:将gitee上origin的master分支拉取过来,与本地的brantest分支合并,如果就是和当前所在的分支合并 < :分支名 >可以省略
3. 问题:有些同学先是 git clone xxx 了一份代码(刚下载的那自然是最新的),然后过了一段时间 gitee 上面的代码更新了,所有你就想着 git pull xxx 来同步一下分支,结果发现就报错了,提示你 "Please commit your changes or stash them before you merge." ,这是告诉你 你本地的代码要先提交到了本地仓库才可以同步(git status 绿色的和红色的都是没有提交的),要么你就先提交到本地仓库,要么就同步状态 git reset --hard origin/master, 要么那就用 stash
git add:
git add qt_ts1.cpp:提交qt_ts1.cpp到缓存区(git status 时变成了绿色) add . 是提交所有的文件到缓存区
git rm --cache qt_ts1.cpp:把缓存区里的 qt_ts1.cpp 恢复回来(git status 时变成了红色) // git rm -r --cache * || git rm -r --cache .
git reset HEAD qt_ts1.cpp:把缓存区里的 qt_ts1.cpp 恢复回来(git status 时变成了红色)
git reset HEAD:把上一次 add 提交的所有内容撤销
git checkout qt_ts1.cpp:撤销 qt_ts1.cpp 的修改 (如果参数时其它分支则表示切换到其它分支)
git commit + git reset :
1. 我写了一些代码,并且 git add . ;git commit -m "ts111";已经提交到本地仓库了。这个时候我使用 git log 可以看到我本地仓库所有的记录和commir_id,然后我现在反悔了,我要撤回我刚刚提交到本地仓库的记录,你需要输入 < git rebase -i "commir_id"^ > 开始编辑这个 rebase ,你可以看到第一行是 < pick id尾号 提交信息 > ,现在你只需要把第一行的 pick 改为 drop 并保存,完了后你会发现你提交到本地仓库之前的代码都被删除了,git log 发现刚刚的那个commir_id 也被删除了。
2. 那如果要恢复怎么办?如果你不记得 commir_id, 你只需要找到它的 hard_id(只要你操作了id 就会生成一条记录存在本地。 git reflog 可以查看所有的操作记录 当然包括hard_id (如e8c0546) ,reflog 它是保存在本地的文件,在 .git/logs/HEAD 里,如果它是空的就会去寻找 .git/logs/refs/heads/master(或者其它的分支) ),然后输入 git reset --hard <hard_id> 即可跳到这个 hard_id 记录。当然如果你记得commir_id,那就 git reset --hard <commit_id> 跳到这个 commit_id记录
3. 我们知道了 reset --hard 是跳到某个id记录,那我们可以这样,比如要返回到上一个commit,我们使用 git reset --hard commit_id (它的前一个id), 要恢复的话我们使用 git reset --hard commit_id / git reset --hard hard_id (记住 操作记录都在 .git/logs/HEAD 用 git reflog 查看)
4. 如果你使用 git reset id (这里没有 --hard )设置到指定的hard_id或commit_id,这个操作不会删除你的文件, 比如这样操作 git add . -> git commit -m "ts" -> git reset <上一个最新的id> 你会发现 git log 是没有了,修改的东西也没有删除,只是 git status 的时候又变成了红色
5. 简单的查看 id 命令:
git log:commit信息;
git log --all:打印全部的commit 信息。比如你 git reset --hard id 跳到很久之前的 id 再使用 git log 那也只能看到它之前的id信息,使用 git log --all 还是可以看到全部的id信息。但如果你使用 git rebase -i "commir_id"^ 的方式直接删除某个 id 那 git log --all 也看不到了
git reflog:只要你操作了id 就会生成一条记录保存在本地, 可以看操作id的实时记录
git show id(c8527ce97006b9f995046a155dabfae2bc6732c8):查看这条id记录修改的东西;
git show id <fileName>:查看这条id记录里具体修改的某个文件
git branch:
1. 当你两个分支不一样的时候(A分支改了一些内容,B分支改了一些其它的内容)你切换分支的时候相应的有差异的代码也会跟着改变
2. 简单的 branch 命令:
git branch:查看本地所有的分支
git branch -a || git branch --all:查看所有的分支包括远程的分支(红色显示)
git branch newBranch:新建分支(git checkout -b newBranch:新建分支同时切换至该分支)
git branch -m newBranch newBranch2:重命名分支
git checkout newBranch:切换到newBranch分支
git merge newBranch:合并newBranch分支至master(先切换至master分支:git checkout master)
git push origin newBranch:推送newBranch分支到gitee,如果服务器没有这个分支将自动创建一个出来
git diff origin/newBranch:对比差异,当前分支和远程服务器newBranch分支差异对比
git branch --delete dev : 删除本地分支 // 或者 -d
git push origin --delete master : 删除远程主分支(需要把远程默认分支改一下(即受保护的分支)) // 场景:想把master分支改成空的。直接在本地把master分支改个名字然后push -> 远程里把默认分支改成其它的 -> 删除远程的master -> 本地新建master并切换过去 -> .git同目录替换成你想要的文件如 master 里面写个 null -> 再上传master,并把默认分支改成master // 如果你想再master的时候直接使用 push ,需要将它设置为上游分支 git push --set-upstream origin master
本文来自博客园,作者:封兴旺,转载请注明原文链接:https://www.cnblogs.com/fxw1/p/16836975.html