计算机

git原理和命令

原理

  • 工作区:就是你在电脑里能看到的目录。
  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
  • 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。

我的理解是:你修改的文件就像子弹。git add就像把子弹填入弹夹,git commit就像上膛,准备发射,git push就像开枪把子弹射出去,发射到远端。

有时候你会遇到一些很神奇的问题,试了很多命令都没有用,这时候你完全可以大胆修改.git文件夹下面的config文件。你会发现git不过如此。

参考文档

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

0 0 votes
Article Rating
guest

2 Comments
Newest
Oldest Most Voted
Inline Feedbacks
View all comments
2
0
Would love your thoughts, please comment.x
()
x