git原理和命令
原理
- 工作区:就是你在电脑里能看到的目录。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
我的理解是:你修改的文件就像子弹。git add就像把子弹填入弹夹,git commit就像上膛,准备发射,git push就像开枪把子弹射出去,发射到远端。
有时候你会遇到一些很神奇的问题,试了很多命令都没有用,这时候你完全可以大胆修改.git文件夹下面的config文件。你会发现git不过如此。
参考文档
https://zhuanlan.zhihu.com/p/96631135
基础命令
拉库和更新
git clone
git pull
拉取分支
git pull --set-upstream origin master 将分支和远程绑定,也可用于push
git fetch origin official/1293m104:official/1293m104 拉分支并切换
git remote set-branches --add origin main 拉单个分支
git checkout -t origin/main -t, --track set upstream info for new branch
创建分支
git checkout -b user/jiapengli/newInterfaceTo104
在上面checkout的基础上branch一个自己新的分支,然后checkout
git branch user/jiapengli/createWallet
然后push到远端,远端就有了这个分支
当你把自己的分支合入原的分支的时候,才算一次提交PR,需要有人code review。
查看分支
git branch
git branch -a 查看全部分支
删文件
git rm
git status
git add -u
git commit
重置代码
git reset --hard 六位字母
删分支
git branch -D main
提交代码
git add 文件
在提交最后一个修改的commit使用–amend参数,这时之前的一个commit将会合并到这个即将提交的commit中来,如果当前提交有注释,则以当前的注释为合并后的提交的注释,若当前提交没有注释,则以上一次提交的注释作为合并后的提交的注释。
git commit -a --amend -m "my message here"
git push
看已修改的代码
git status
推分支
.git/config
[remote "origin"]
url = https://microsoft.visualstudio.com/DefaultCollection/Edge/_git/chromium.src
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/tags/*:refs/tags/*
从暂存区复原
如果你add了 想取消add
git reset HEAD
如果你commit了 想取消commit
git reset --soft HEAD^
复杂命令
rebase总结
rebase总结:
你拉了一个分支,在这个分支上开发。然后别人改了这个分支的代码。当你提交的时候,就会发生冲突
Step1. 在本地仓库中, 更新并合并代码
git fetch origin
git rebase origin/baby_1-0-1256_BRANCH 开发的分支
Step2. 依据提示分别打开冲突的文件, 逐一修改冲突代码
Step3. 所有冲突都修改完毕后, 提交修改的代码
git add -u
git rebase --continue
Step4. 更新patch
git push origin HEAD:refs/for/baby_1-0-1256_BRANCH
commit错了回退,比如没带icafe的id
git reset --soft HEAD^
然后再执行提交代码即可
强制复原
git reset --hard origin/papi_1-3-1678_BRANCH(分支)
强制覆盖
git fetch --all
git reset --hard origin/main origin/papi_1-3-1546_BRANCH
git pull
重置到最新的远端分支
git fetch origin
git reset --hard origin/main
同步主干后,提交历史多出一堆文件的解决办法
git log 找到同步主干的那次历史
git reset 切到那次历史
再次 git add . 提交一次
之前的提交diff会消失,会重新生成一个diff,就只剩你改的diff了
放弃修改
git checkout .
临时保存修改的文件
git stash
git stash save ''
git stash apply 'stash@{0}'
git stash list 展示stash列表
git stash show -p 显示某个存储的改动 git stash show stash@{1}
git stash drop
回退某一个文件的版本
git log 某个文件 文件夹
git checkout [commit id] 这个文件
git commit ,push 即可
git add 排除某个文件
git add -u -except .\tmp.txt
可以用gitignore
git看某个文件的修改历史
git blame 文件 > tmp.txt
批量删除本地分支
git branch|grep -v -E ".(zeshi|code)."| xargs git branch -D
可以自己写正则。windows不能执行grep就在git bash里执行
删除远端已删除本地仍存在的分支
git remote prune origin
There are probably some commands to resolve it, but I would start by looking in your .git/config file for references to that branch, and removing them.
git 配置
git config --local user.name ""
git config --local user.email ""
git config --local core.autocrlf false
git config --local core.filemode false
git config --local branch.autosetuprebase always
git config --system core.longpaths true
git cherry pick
功能:将某个分支的部分改动(某次提交)应用到别的分支上 教程
注意先把分支切到你想cp的分支,强制同步到远端,然后再开始cp
git fetch origin
git reset --hard origin/official/1587m110
git cherry-pick <commitHash>
git cherry-pick A..B A早于B,不包含A
git cherry-pick A^..B 包含A
一个PR即便有多次提交,在main分支也只会有一个commit。cherry-pick的时候在main分支找到那个commit
main更新后,需要pull更新本地代码,这样cherry-pick才知道pick哪些代码
取消merge
rm ".git/rebase-merge"
取消add
add的文件会进入staged change。git reset就能撤销掉,让他变成change状态
别名
你可以自定义git的命令。就我个人的经验,约一半的顶尖研发都会自定义git
$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch
git config --global alias.unstage 'reset HEAD'
git config --global alias.last 'log -1'
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
本质:这里的修改其实都在.git/config
和 .gitconfig文件中。直接在这里删除/修改即可
我自己的配置
git config --global alias.cl "clone"
git config --global alias.s "status"
git config --global alias.d "diff"
git config --global alias.co "checkout"
git config --global alias.cmn "checkout main"
git config --global alias.cmt "checkout master"
git config --global alias.cmend "commit --amend --no-edit"
git config --global alias.cb "checkout -b"
git config --global alias.cbb "checkout -b user/jiapengli/"
git config --global alias.br "branch"
git config --global alias.last "log -1 HEAD"
git config --global alias.pr "pull --rebase"
git config --global alias.lo "log --oneline -n 10"
git config --global alias.a "add ."
git config --global alias.am "commit -a -m add"
git config --global alias.cm "commit -m"
git config --global alias.cma "commit -m add"
git config --global alias.cmf "commit -m fix"
git config --global alias.rh "reset --hard"
//git config --global alias.unstage 'reset HEAD'
git config --global alias.rs "reset --soft HEAD^"
git config --global alias.ps "push"
git config --global alias.pl "pull"
git config --global alias.pll "pull --set-upstream origin master"
git config --global alias.fo "fetch origin "
git config --global alias.ra "remote set-branches --add origin "//拉单个分支
git config --global alias.pso "push --set-upstream origin "
git config --global alias.mo "merge origin/"
查看本地分支创建时间
git reflog show --date=iso <branch name>
疑难杂症
error: cannot lock ref ‘refs/remotes
PS D:\xpay> git fetch
error: cannot lock ref ‘refs/remotes/origin/Release_XPay’: is at e71803a055b13b28e3e2e0037422234d57973da3 but expected cd71d076cbaeb8f1e064b4eea577cd7eab1879dd
From https://dev.azure.com/msasg/XPay/_git/xpay
! cd71d076cb…0e113240bd Release_XPay -> origin/Release_XPay (unable to update local ref)
这个问题通常是由于本地仓库中的远程跟踪分支引用与远程仓库实际上的状态不同步所导致的。解决这个问题的方法之一是删除本地的远程跟踪分支引用,然后再次执行 git fetch
来重新获取远程仓库的状态。可以使用以下命令来删除本地的远程跟踪分支引用:
解决方案:
git update-ref -d refs/remotes/origin/Release_XPay
git update-ref
命令用于创建、更新、删除、验证和查看引用。在这个特定的命令 git update-ref -d refs/remotes/origin/Release_XPay
中,选项和参数的含义如下:
-d
:这是--delete
的缩写形式,它指示git update-ref
删除指定的引用。refs/remotes/origin/Release_XPay
:这是要删除的引用的完整路径。在 Git 中,refs/remotes/origin/
是存储远程仓库origin
引用的本地目录。Release_XPay
是远程分支的名称。
综合起来,这个命令的作用是从本地 Git 仓库中删除 Release_XPay
这个远程跟踪分支的引用。这通常用于解决当远程分支的历史与本地缓存的历史不一致时的问题。删除引用后,可以使用 git fetch
命令重新获取远程仓库的状态,这将创建一个新的、最新的引用。
解决方案 2
- git fetch –prune origin update local copies of remote branches
- git remote prune origin remove info about removed remote branches
删除third_party
git checkout <commit> -- /xxx/folder
commit可以是 origin/main
有时候远端会多出一些本地没有的文件,需要删掉。
切到git bash
rm -rf third_party文件夹
git rm third_party文件夹
git a
git commit 注意只是commit
git ps
git push 不上去
看下是不是公司弹出的git登录窗口没有登录
最后更新于 2024年6月26日 by qlili
https://cloud.tencent.com/developer/article/1835785
pip配置
国内加速git
https://cloud.tencent.com/developer/article/1835785
git clone https://gitclone.com/github.com/tendermint/tendermint.git`