git必备知识 git使用常见问题(提交代码,合并冲突)
git常用命令(简介,详细参数往下看)
git fetch 获取远程分支更新
git branch 查看本地分支
git branch -r 查看远程分支
git branch -a 查看所有分支(本地分支和远程分支)
git branch -b dev 创建dev分支
git checkout 切换分支
git checkout -b dev 创建并切换到dev分支
git clone 地址 克隆代码
git pull 同步到本地(拉)
git push 推送至服务器
git checkout -b dev origin/master 基于主分支创建dev分支
git add . 添加到缓存
git commit -m “提交说明” 将暂存区内容提交到本地仓库
git commit -a -m “提交说明” 跳过缓存区操作,直接把工作区内容提交到本地仓库
git status 查看仓库当前更改状态
git merge 分支名 将指定的分支代码合并到当前分支
git cherry-pick commit-hash 指定某次提交记录合并另到当前分支
git log 查看当前分支的提交记录
git clean 命令用来从你的工作目录中删除所有没有tracked过的文件
还原代码
git reset --hard
git clean -df
两个一起用:工作目录和缓存区复原,已经回到干干净净的目录结构,一般只用 git reset --hard就可以了
撤销 git commit (mixed:撤销代码改动,soft:保留代码改动)
git reset --mixed HEAD^ 不删除工作空间改动代码,撤销commit,并且撤销git add
git reset --soft HEAD^ 仅仅是撤回commit操作,改动的代码仍然保留
git 配置
git config –global user.name “用户名” # 设置用户名
git config –global user.email “用户邮箱” #设置邮箱
git config user.name 查看用户名是否配置成功
git config user.email 查看邮箱是否配置
git 代码提交步骤
一般使用git stash 隐藏本地代码,然后git pull 拉取代码,然后再git stash apply (如果有冲突合并,没有继续下一步),然后再git commit -m ‘’,最后git push。一般代码都有审核可能提交代码时需要加一些其他的参数
git pull --> git status --> git add --> git commit --> git push (同步->查看状态->提交缓存区->推送至git库->提交代码到远程仓库)
例子:
git push origin HEAD:refs/for/develop
git push origin HEAD:refs/for/develop 是一个 Git 命令,但它是 Gerrit 代码评审系统中一个常用的推送格式,而不是标准 Git 的用法。
让我们分解这个命令:
git push:这是 Git 的一个命令,用于将本地仓库的更改推送到远程仓库。
origin:这是远程仓库的默认名称(但你可以给它取任何名字)。它通常指向你克隆仓库时所用的 URL。
HEAD:refs/for/develop:这是 git push 命令的引用规范(refspec)。它定义了如何将本地的引用(在这个例子中是 HEAD)映射到远程仓库的引用。
HEAD:在 Git 中,HEAD 是一个特殊的引用,它指向当前检出的提交或分支。当你不指定任何分支或提交时,HEAD 通常表示你当前所在的分支的最新提交。
refs/for/develop:这不是 Git 的标准引用格式。在 Gerrit 中,这个引用规范表示你希望将更改推送到名为 develop 的分支,但首先你希望这些更改通过 Gerrit 的代码评审流程。具体来说,Gerrit 会为这些更改创建一个更改集(change set),并允许其他开发者进行评审。
所以,当你运行 git push origin HEAD:refs/for/develop 时,你实际上是在说:“我想将我当前分支的最新更改推送到远程的 origin 仓库,但我不希望这些更改直接合并到 develop 分支。相反,我希望 Gerrit 创建一个新的更改集来供我的团队评审。”
注意:在使用这个命令之前,你需要确保你的 Git 仓库已经配置为与 Gerrit 服务器交互,并且你已经在你的本地 Git 配置中设置了相应的推送和获取 URL(这些通常包括特定的 Gerrit 引用)。
还有一些具体的参数指令说明需要更具实际情况添加
git stash(根据具体情况选择是否使用)
当我们在某一条分支上开发新功能时,突然有个紧急的错误需要修复
这时,我们不得不暂停手头上的工作,切换到另外的分支去修复错误
但是,新功能做到一半,既不能提交,也不能删除,那该怎么办呢
我们可以先把当前的更改保存起来,等处理完错误后再恢复出来,git stash 就是这样的一个用法:它可以将工作区和缓存区的更改保存到一个栈结构中,等后面需要的时候再恢复
一般使用git stash 隐藏本地代码,然后git pull 拉取代码,然后再git stash apply (如果有冲突合并,没有继续下一步),然后再git commit -m ‘’,最后git push
保存:git stash
> # 将当前工作区和暂存区的更改保存到一个栈结构
> git stash
> # 将当前工作区和暂存区的更改保存到一个栈结构,并附带一个信息
> git stash save "message"
> # 将当前工作区和暂存区的更改保存到一个栈结构,包括新增的文件
> git stash -u
> git stash --include-untracked
> # 将当前工作区和暂存区的更改保存到一个栈结构,包括新增的文件以及忽略的文件
> git stash -a
> git stash --all
查看栈中保存的更改:git stash list
# 查看栈中保存的更改
> git stash list
查看更改的具体内容:git stash show
# 查看栈中第一个更改的具体内容
> git stash show
> # 查看栈中指定的更改的具体内容
> git stash show <stash id>
恢复:git stash apply
# 将栈中的第一个更改恢复到当前工作区和暂存区
> git stash apply
> # 将栈中的指定的更改恢复到当前工作区和暂存区
> git stash apply <stash id>
删除:git stash drop
# 将栈中的第一个更改恢复到当前工作区和暂存区
> git stash apply
> # 将栈中的指定的更改恢复到当前工作区和暂存区
> git stash apply <stash id>
恢复 & 删除:git stash pop
> # 将栈中的第一个更改恢复到当前工作区和暂存区,同时删除栈中的第一个更改
> git stash pop
> # 将栈中的指定的更改恢复到当前工作区和暂存区,同时删除栈中的指定的更改
> git stash pop <stash id>
清空:git stash clear
> # 清空栈中保存的更改
> git stash clear
git pull
git pull 是一个 Git 命令,用于从另一个存储库或本地存储库的另一个分支获取并集成(整合)更改。具体来说,git pull 实际上执行了两个操作:
git fetch:从远程存储库获取最新的更改,但不整合到当前的工作分支。这些更改被存储在本地的远程跟踪分支(如 origin/master)中。
git merge:将远程跟踪分支的更改合并到当前的工作分支。
但是,git pull 的默认行为可能会因配置的不同而略有变化。特别是,如果你设置了 pull.rebase 为 true(通过 git config --global pull.rebase true),那么 git pull 将执行 git fetch 加上 git rebase 而不是 git merge。
使用方法
要执行 git pull,你通常需要指定一个远程存储库(默认为 origin)和一个分支(默认为当前分支跟踪的远程分支)。但是,如果你没有指定这些参数,Git 会使用默认值。
例如:
bash
从默认的远程存储库(origin)和当前分支的跟踪分支获取并整合更改
git pull
从名为 upstream 的远程存储库和名为 main 的分支获取并整合更改
git pull upstream main
注意事项
在执行 git pull 之前,最好先运行 git status 来确保你的工作目录是干净的(即没有未提交的更改)。否则,你可能需要解决合并冲突。
如果你经常与团队成员一起工作,并希望避免不必要的合并冲突,那么定期执行 git pull(或 git fetch 加上 git rebase)是一个好习惯。
如果你设置了 pull.rebase 为 true,并希望在进行 git pull 时保留合并提交(而不是使用 rebase),你可以使用 --no-rebase 选项:git pull --no-rebase。
在某些情况下,你可能只想获取最新的更改而不整合它们(例如,如果你只是想查看最新的更改但不打算立即合并它们)。在这种情况下,你可以使用 git fetch 命令。
git status
常用命令以及详细参数
git add 将文件添加到仓库:
git add 文件名 将工作区的某个文件添加到暂存区 git add . 将当前工作区的所有文件都加入暂存区 git add -u
添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件 git add -A
添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件 git add -i
进入交互界面模式,按需添加文件到缓存区
#将暂存区文件提交到本地仓库: git commit -m “提交说明” 将暂存区内容提交到本地仓库 git commit -a -m “提交说明” 跳过缓存区操作,直接把工作区内容提交到本地仓库
git diff 比较文件异同
git diff 工作区与暂存区的差异 git diff 分支名 工作区与某分支的差异,远程分支这样写:remotes/origin/分支名
git diff HEAD 工作区与HEAD指针指向的内容差异 git diff 提交id 文件路径 工作区某文件当前版本与历史版本的差异
git diff –stage 工作区文件与上次提交的差异(1.6 版本前用 –cached) git diff 版本TAG
查看从某个版本后都改动内容 git diff 分支A 分支B 比较从分支A和分支B的差异(也支持比较两个TAG) git diff
分支A…分支B 比较两分支在分开后各自的改动 另外:如果只想统计哪些文件被改动,多少行被改动,可以添加 –stat 参数
git log 查看历史记录
git log 查看所有commit记录(SHA-A校验和,作者名称,邮箱,提交时间,提交说明) git log -p -次数
查看最近多少次的提交记录 git log –stat 简略显示每次提交的内容更改 git log –name-only
仅显示已修改的文件清单 git log –name-status 显示新增,修改,删除的文件清单 git log –oneline
让提交记录以精简的一行输出 git log –graph –all –online 图形展示分支的合并历史 git log
–author=作者 查询作者的提交记录(和grep同时使用要加一个–all–match参数) git log –grep=过滤信息
列出提交信息中包含过滤信息的提交记录 git log -S查询内容 和–grep类似,S和查询内容间没有空格 git log
fileName 查看某文件的修改记录
git reset 代码回滚
git reset HEAD^ 恢复成上次提交的版本 git reset HEAD^^
恢复成上上次提交的版本,就是多个^,以此类推或用~次数 git reflog git reset –hard 版本号
–soft:只是改变HEAD指针指向,缓存区和工作区不变; –mixed:修改HEAD指针指向,暂存区内容丢失,工作区不变;
–hard:修改HEAD指针指向,暂存区内容丢失,工作区恢复以前状态;
版本库相关操作
删除版本库文件:git rm 文件名 版本库里的版本替换工作区的版本:git checkout — test.txt
远程仓库相关操作
同步远程仓库:git push -u origin master 本地仓库内容推送到远程仓库:git remote add origin
git@github.com:帐号名/仓库名.git 从远程仓库克隆项目到本地:git clone
git@github.com:git帐号名/仓库名.git 查看远程库信息:git remote
拉取远程分支到本地仓库:
git checkout -b 本地分支 远程分支 # 会在本地新建分支,并自动切换到该分支 git fetch origin
远程分支:本地分支 # 会在本地新建分支,但不会自动切换,还需checkout git branch –set-upstream 本地分支
远程分支 # 建立本地分支与远程分支的链接 同步远程仓库更新::git fetch origin master
分支相关操作
创建分支
创建分支:git checkout -b dev -b表示创建并切换分支 上面一条命令相当于下面的二条: git branch dev
创建分支 git checkout dev 切换分支
查看分支:git branch
合并分支:git merge
git merge dev #用于合并指定分支(dev)到当前分支 git merge –no-ff -m “merge with
no-ff” dev #加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
例如:项目中有两个分支:test,test2 在test分支中执行 git merge origin/test2
(将test2分支合并到test分支中)
删除分支:git branch -d dev
查看分支合并图:git log –graph –pretty=oneline –abbrev-commit
git指定某次或者连续几次提交记录合并另一个分支
git cherry-pick
通过 git log 获取提交历史的哈希值 ----> 然后在切换到合并的分支上面 ----> git cherry-pick commit-hash
eg: 将只需a分支的 第二次提交合并到b分支上,需要再a分支上git log查询到第二次提交的哈希值,然后切换到b分支上面,执行git cherry-pick commit-hash ; 如果想要合并一个提交范围,可以使用 git cherry-pick start-commit-hash ^… end-commit-hash 去执行,当然,这期间出现的冲突需要手动去合并。
撤消某次提交
git revert HEAD # 撤销最近的一个提交
git revert 版本号 # 撤销某次commit
git用户名密码相关配置
安装完Git后第一件要做的事,设置用户信息(global可换成local在单独项目生效): git config –global
user.name “用户名” # 设置用户名 git config –global user.email “用户邮箱” #设置邮箱 git
config user.name 查看用户名是否配置成功 git config user.email 查看邮箱是否配置