0.Git基本工作原理1. 拉取远程分支到本地该方式拉取的分支都是远程代码仓中的分支。1.1. 克隆方式方式一该方式会将所有分支信息都拉下来然后通过切换分支操作直接切换到相应分支。1克隆项目所有分支到本地包含所有分支gitclone仓库地址(如https://github.com/xxx/xxx.git)# 克隆时重命名远程主机一般情况克隆时的远程主机名默认为origin可通过参数-o对远程主机重新命名gitclone-ojQuery https://github.com/jquery/jquery.git# checkout某分支gitcheckout分支名2克隆项目指定分支到本地仅包含指定分支gitclone-b分支名仓库地址1.2. 拉取方式方式二该方式会将指定分支信息都拉下来远程仓库中的其他分支信息不会出现在本地仓库。1打开git bash命令窗2创建本地代码仓名mkdirMyProject3进入本地仓文件夹MyProject并初始化cdMyProjectgitinit4建立与远程主机origin的连接gitremoteaddorigin克隆地址(如https://github.com/xxx/xxx.git)注意Git 1.7.0后可以使用Sparse Checkout稀疏检出模式实现。如果希望从Git的远程仓库里检出或拉取指定文件夹或部分文件出来则先通过如下命令设置后再执行第5~7步# 设置Sparse Checkout稀疏检出模式指定允许检出的文件夹或部分文件gitconfig core.sparsecheckouttrue# 指定检出archive/config目录下的application.yamlechoarchive/config/application.yaml.git/info/sparse-checkout# 也可以使用通配符比如archive*表示archive开头的所有目录!archive表示不包含archive目录。# 检出archive目录下所有文件夹和文件echo archive .git/info/sparse-checkout5拉取远程分支到本地gitfetch远程主机名分支名# git fetch origin master表示“取回origin主机的master分支”注意也可以通过命令get fetch origin 远程分支名称Branch_1:本地新建分支名称Branch_1_Loc直接拉取远程分支名称Branch_1并创建本地新分支远程分支名称Branch_1_Loc则不用执行6和7。6在本地创建分支Branch_1_Loc并切换到该分支这里创建的Branch_1_Loc分支远程代码仓不可现gitcheckout-b本地分支名称(Branch_1_Loc)远程分支名称(origin/Branch_1)注意如果想直接拉取远程分支Branch_1内容并合并到本地分支Branch_loc_tmp可采用如下命令gitcheckout本地分支名称(Branch_loc_tmp)#进入本地分支gitpull origin远程分支名称(Branch_1)#拉取远程origin的分主机支合并到本地当前所在分支这里git pull与git fetch的差异简单可以理解为git pull git fetch git merge详细差异可参考链接。2. 基于本地已有分支创建本地分支该方式创建的本地分支只在本地可现远程代码仓不可现。其他信息请参考链接1切换到某个分支如Branch_xgitcheckout Branch_x2在该分支下创建分支如Branch_x_loc1gitcheckout-bBranch_x_loc1注意上述Branch_x_loc1即为根据Branch_x创建的。若要将新建Branch_x_loc1推送到远程代码仓则执行如下命令gitpush origin Branch_x_loc13. 文件状态与版本提交3.1 文件状态1添加/删除跟踪状态文件或目录一旦被跟踪这一辈子都会在仓库中被跟踪。# 添加跟踪gitadd文件名或目录# 删除跟踪gitrm文件名或目录#删除跟踪状态及文件本身gitrm--cache文件名或目录#仅删除跟踪状态文件本身以未跟踪状态保存在本地2设置/取消缓存(暂存)状态# 设置缓存状态gitadd文件名# 取消缓存状态gitreset HEAD文件名3提交/撤回修改# 提交修改gitcommit-m本次提交的注释信息# 方式一撤回提交# 1.参数--soft不删除工作空间commit时改动的内容。也即只撤销git commit不撤销git add。gitreset--softHEAD~i# 若用HEAD^则表示上一个版本# 方式二撤回提交# 1.参数--hard删除工作空间commit时改动的内容。也即撤销git commit且撤销git add。gitreset--hardHEAD~i# 注上述的i1...k且最近一次提交编号为1。4查看文件在工作区和暂存区之间的具体差异# 查看工作区和暂存区之间所有的文件差异gitdiff# 查看具体某个文件 在工作区和暂存区之间的差异gitdiff-- 文件名# 查看多个文件在工作区和暂存区之间的差异gitdiff-- 文件名1 文件名2 文件名3其他更多diff对比命令请参考链接所述。3.2 版本提交网上图文资料请参考链接。具体流程如下1查看当前状态# 查看当前分支所有文件的状态gitstatus从当前状态中可以看出所有更改项。2添加本地缓存添加需要提交的内容到本地Git缓存区。两种方式方式1提交全部更改gitadd.方式2只提交file_i.xx文件的更改gitaddfile_i.xx3提交代码gitcommit-m更改说明4本地合并分支取回远程主机某个分支的更新再与本地的指定分支合并。gitpull远程主机名远程分支名:本地分支名#拉取远程主机分支合并到指定本地分支gitpull远程主机名(如origin)远程分支名#拉取远程主机分支合并到本地当前分支该过程也可通过“5.更新合并分支”这一节所述方式实现。5推送远程分支把当前提交到git本地仓库的代码推送到远程主机的某个远程分之上。gitpush远程主机名本地分支名:远程分支名#推送本地分支到远程主机指定分支gitpush远程主机名(如origin)远程分支名#推送当前所在本地分支到远程主机指定分支3.3 版本日志git log命令主要用于查看Git版本演变历史也就是提交历史同时根据追加的参数和选项不同也会有不同的展示效果。详细命令如下不带参数如果不带任何参数它会列出所有历史记录最近的排在最上方显示提交对象的哈希值作者、提交日期、和提交说明。如果记录过多则按上下键Enter向下显示一行空格显示下一页来控制显示。按q键退出历史记录列表。常用显示参数-p按补丁格式显示每个更新的差异比下一条–stat命令信息更全。--stat显示每次提交修改文件的统计信息每个提交都列出了修改过的文件以及其中添加和移除的行数并在最后列出所有增减行数小计。--shortstat只显示–stat中最后的行数添加、修改、删除的统计。--name-only仅在提交信息后显示已修改的文件清单。--name-status显示新增、修改、删除的文件清单。--abbrev-commit仅显示SHA-1校验和的前几个字符而非所有的40个字符。--relative-date使用较短的相对时间而不是完整格式显示日期比如“2 weeks ago”。--graph在日志旁以ASCII图形显示分支与合并历史。--online列表的形式查看历史版本记录–prettyoneline --abbrev-commit 合用的简写。--pretty使用其他格式显示历史提交信息。可用的选项包括oneline、short、full、fuller和 format用来定义自己的格式。# %ad提交日期# 显示提交的日期和时间。# 特点这个时间是在作者的本地机器上设置的通常不会因为后续的合并操作而改变。# 示例假设你在本地编写代码并创建了一个提交这个时间就是 %ad。# 默认格式是 Tue Mar 25 14:30:00 2025 0800。#%cd提交者日期# 显示提交者的日期和时间。# 特点这个时间通常是在服务器上设置的反映了提交被合并到仓库的时间。# 示例当你将一个分支的提交合并到主分支时%cd 会显示合并操作的时间。#%h提交的短哈希值# 显示提交的短哈希值通常是前7位。#%s提交信息# 显示提交信息。#%an作者名称# 显示提交作者的名称。#%ae作者邮箱# 显示提交作者的邮箱。gitlog--oneline--graph--prettyformat:%h: %an, %cd3.4 修改已push的commit内容针对一次攒了多个本地提交的Commit一把push到远程仓库但是Committer发现Commit Message写得不太规范需要全部修改好再push一遍的情况请参考链接1和链接2。4. 切换远程仓库地址1查看远程仓库的地址gitremote-v2修改远程仓库地址方式一直接修改gitremote set-url主机名远程仓库地址方式一删除再添加删除旧的远程仓库gitremoterm主机名添加新的远程仓库地址gitremoteadd主机名远程仓库地址3其他远程仓库操作命令# 命令列出所有远程主机gitremote# 查看该主机的详细信息gitremote show主机名# 添加远程主机gitremoteadd主机名网址# 修改远程主机名gitremoterename原主机名新主机名5. 更新合并分支5.1.merge rebase更新合并全部内容5.1.1 拉取、切分支再合并将主干分支master内容更新到其他分支步骤如下1本地先切换到master分支gitcheckout master2将master分支代码pull下来gitpull3切换到待更新分支gitcheckout 待更新分支名(如my_branch)注意如需在第(4)步中将master强行合并到“待更新分支”此处可使用git checkout -f 待更新分支名(如my_branch)。使用了-f命令后后面的merger过程将不会有任何提醒。4将master分支代码合并到待更新分支my_branch。下面两种操作方式是等价的# 1. merge方式将master分支的变更合并到当前分支my_branch# master ─────●─────●─────●# ↘# my_branch ─────●─────●─────●─────● (merge commit)# ↑# 合并进来gitcheckout my_branchgitmerge master# 2. rebase方式将当前分支my_branch变基到master分支之上简单理解即将my_branch嫁接到master后面效果同merge但历史线性# 图例解释# master ─────●─────●─────●─────●# ↑# my_branch ─────●─────●────────┘ (变基后接到 master 最新提交后)gitcheckout my_branchgitrebase master一般情况下merge和rebase的使用条件如下merge在开发中希望可以查看每个commit的详细信息时采用git merge。例如将自己分支合并到公共分支如master当遇到问题需要回溯时可以查看自己提交的commit信息。rebase在开发中不希望查看commit的详细信息时采用git rebase。例如在自己分支上工作或者将公共分支如master合并自己分支后续无需查看自己提交的commit信息。5将merge后的代码push到待更新分支gitpush origin 待更新分支名(如my_branch)5.1.2 直接合并merge模式# 方式1.直接pull时mergegitcheckout my_branchgitpull origin master# 方式2.先更新本地origin缓存然后rebasegitfetch origingitmerge origin/developrebase模式# 方式1.直接pull时rebasegitcheckout my_branchgitpull--rebaseorigin master# 方式2.先更新本地origin缓存然后rebasegitfetch origingitrebase origin/develop5.2.cherry-pick更新合并指定提交内容如下图当前所在分支为a想把分支b上的4、6、8号提交合并到分支a上命令如下# (1)合并4号提交gitcherry-pick commit-id-4# (2)同时合并4号、8号提交gitcherry-pick commit-id-4 commit-id-4# (3)同时合并(4号, 8号]提交也即同时合并4号到8号之间的所有提交含8号但不包括4号gitcherry-pick commit-id-4..commit-id-4# (4)同时合并[4号, 8号]提交也即同时合并4号到8号之间的所有提交含4号、8号gitcherry-pick commit-id-4^..commit-id-4该图片来至视频【五分钟学会git cherry-pick面试不再愁】如果cherry-pick过程出现冲突可采用如下操作#1解决冲突gitaddgitcherry-pick--continue#2回滚gitcherry-pick--abort#3中断(该命令用的比较少)gitcherry-pick--quit6. Git其他操作6.1. 查看所有分支gitbranch-a6.2. 查看当前使用分支gitbranch注意结果列表中前面标*号的表示当前使用分支。6.3.建立追踪关系# 建立本地分支master与远程主机origin的分支next之间的追踪关系gitbranch --set-upstream master origin/next6.4. 切换分支gitcheckout 分支名在切换分支时若提示如下错误则表明当前分支修改内容未提交。可通过commit提交、也可通过stash缓存后再行切换分支。error: Yourlocalchanges to the following files would be overwritten by checkout: src/.../xxx.py src/.../.../yyy.py Please commit your changes or stash them before you switch branches.注git stash命令可将当前分支如dev未提交的修改即工作区的修改和暂存区的修改先暂时储藏起来这样工作区干净了后就可以切换切换到其他分支。在重新切换会dev分支后通过git stash pop命令将之前储藏的修改取出来继续进行功能开发。详细命令如下# 1.查看储藏记录列表。如# stash{index}: WIP on [分支名]: [最近一次的commitID] [最近一次的提交信息]gitstash list# 2.储藏内容。即存储未提交的修改stashMessage为当前储藏添加的备注信息。gitstash savestashMessage# 3.取出存储内容# 方式1取出不删除。取出指定index的储藏内容到工作区中但不从储藏记录列表中删除。gitstash apply stash{index}# 方式2取出并删除。取出最近一次的储藏内容到工作区中同时从储藏记录列表中删除。gitstash pop# 3.删除存储内容。删除指定index的储藏内容。gitstash drop stash{index}6.5. 删除分支其他信息请参考链接# 1.删除本地分支gitbranch-D本地分支# 2.删除远程分支方式一(冒号必需带上)gitpush origin :远程分支# 删除远程分支方式二gitpush origin--delete远程分支若要同时删除本地与远程分支则同时执行上述两条命令。6.6. 删除仓库中的文件目录或文件gitrm-r--cachedFileName[or DirectoryName]#参数--cached同时删除缓存gitcommit-mdeletegitpush6.7. 清除git版本控制信息find.-name.git|xargsrm-rf参考链接1Git与GitHub中文参考文档2Git速查表3Git基础与进阶4git clone/push/pull/fetch命令详解