
git 是非常灵活的 项目管理工具灵活主要体现在 同一个 操作 可以通过 不同的 方式实现。以下介绍几个核心概念Workspace工作区文件编辑的地方Index / Stage暂存区.git目录下的index文件, 暂存区会记录git add添加文件的相关信息Repository本地仓库git commit后同步index的目录树到本地仓库Remote远程仓库^_^ git安装sudo apt install git # 开始安装 git --version^_^ 本地仓 和 远程仓 的 连接add方式 建立 连接git init git add . git commit -m 相关说明 # 修改最近一次且没有 push 的 commit -m 之后的说明 git commit --amend -m 新的 相关说明 git remote add origin 远程仓地址https 或 ssh git push -u origin master git push git pull说明-u 参数说明是 --set-upstream 的简写作用是 关联分支 。以后 git push 就能默认找到关联分支masteradd . 和 add * 是有区别的add . 在添加文件的时候会根据 .gitignore文件做过滤强推送 git push -u origin master-f的后果是本次推送的内容会覆盖点 该分之下原有的内容及推送记录。push 和 pull 都是默认的关联分支如果想 推送 和 拉取 非关联分支那就得指定一下 git pushorigindev克隆方式建立连接git clone 远程仓地址https 或 ssh删除连接git remote rm origin查看连接aaa.txtgit remote -v说明如果是 https// 就是采用的是https方式如果是 git 就是采用的是 ssh 的方式;若是什么都不返回说明 没有和 远程建立连接扩展 把项目 B 作为 项目 A 的 分支 推送cd你的B项目目录rm-rf.gitgitinitgitadd.gitcommit-madd project B as branchgitremoteaddorigin gitgitee.com:yourname/project-A.gitgitcheckout-bproject-b-branchgitpush-uorigin project-b-branch扩展 操作git钩子git 在 commit 或 push 之前都会调用一个钩子如不想用这个钩子只需将相应的文件夹改个名字例如不想在 commit 时 进行js的语法检测cd .git/hooksmv pre-commit pre-commit123完成^_^ 忽略、删除 已上传 远程仓库 的 文件比如: 工程目录下 有个 tmp/main 文件我们之前已经上传到 远程仓库现在不想要这个文件了。1️⃣ 忽略在 .gitignore 文件中写入tmp/main验证是否已忽略gitcheck-ignore-vtmp/main# 输出# .gitignore:7:tmp/main tmp/main如果有输出说明规则已生效如果无输出检查.gitignore路径是否写对。也可以通过git status验证是否已忽略2️⃣ 删除从 Git 本地仓库 中删除 索引但保留本地文件gitrm--cachedtmp/main--cached表示只从 Git 索引中删除不会删除你本地的实际文件然后提交这个变更gitcommit-m停止追踪 tmp/main提交gitpush这样远程仓库 会 删除这个文件。这样以后tmp/main就不会再被 Git 追踪了 ✅⚠️ 注意事项场景操作本地还想保留tmp/main文件用git rm --cached推荐本地也不想保留该文件用git rm tmp/main会同时删除本地文件团队协作别人本地已有该文件他们 pull 后该文件会被删除但本地未提交的修改会冲突需先处理^_^ commit版本迭代1. 查看 commit推送记录# 缩略展示 git log --oneline # 只看 指定用户的 推送记录 git log --authorWangHaiOu # 只看 指定日志 之前的推送记录 git log --before2022-08-22说明每个commit都有对应唯一的commitID每次commit就相当于是一个版本2. 版本回退git reset --hard HEAD^ # 回到上个版本 git reset --hard HEAD^^ # 回到上上个版本 git reset --hard commitID # 回到指定的版本 git reflog # 查看 操作版本 的记录3. 版本区别 git diff使用git比较两次commit之间的差异文件commitHash1 是先于 commitHash2 提交的哈希值gitdiffcommitHash1 commitHash2--stat// 查看哪些文件是有改动的gitdiffcommitHash1 commitHash2 src/views/home/Home.vue // 查看文件具体改动的内容4. 冲突合并拉取的 内容 和 我们 最新 commit 后的内容 产生冲突时 要进行 冲突处理。# step1 查看是否有 冲突的 文件gitdiff--check》 以下显示 冲突的文件 和 位置 aaa.txt:3: leftover conflict marker aaa.txt:5: leftover conflict marker aaa.txt:7: leftover conflict marker# 在vscode中看到的aaa.txt是这样的1funcaaa(){2this is aaa is name tom3HEAD4this isaddtom12356this isaddcat123774ae07ab9aaef1651f3029e4c3fac4d5482bde648this is hahaah9}# step2: 合并冲突 通过 vim 处理冲突以上冲突 合并 可以删除 第 3457行。vimaaa.txt# 推荐使用 vscode 进行处理方便省心。5. 改动查看 git show查看改动 的 文件信息# 1.查看最后一次提交记录的修改文件信息gitshow--raw# 2.查看指定commit id对应修改文件列表gitshow--rawcommit_id######### 输出:100644100644e562209 7eab101 M pkg/logger/logger.go :100644100644fff176c 86f72e6 D pkg/setting/section.go :100644100644586daa9 80f292b A pkg/setting/setting.go :100644100644dca125f 254e8ad M pkg/tracer/tracer.go :100644100644db5ce21 5bc1eb2 M storage/logs/app.log输出说明 M修改 A增加 D删除查看改动 的 文件 内容信息# 1.查看最后一次提交记录的修改gitshow# 2.查看指定commit id对应的修改gitshow commit_id# 3.查看指定commit id对应的 特某文件 的 修改gitshow commitId fileName######### 输出commit 2447e2b9c15472f2ead7bf451aa5f11111111112(HEAD -master)Author: aaaaaa163.comDate: Sun Aug2115:22:0820220800 update example data# 第一行 -------------------diff--gita/name.txt b/name.txt# 第二行 -------------------index ac37a53..0ed306a100644# 第三行 ---------------------- a/name.txt b/name.txt# 第四行 ------------------- -1,4 1,4 tom-alicejerry bily andy# 第五行 -------------------\No newline at end offilediff--gita/age.txt b/age.txt......\No newline at end offile输出说明第一行diff --git a/name.txt b/name.txt该行是说接下来 展示中以 a/name.txt 代表修改之前的文件名 以 b/name.txt 代表修改之后的文件名。第二行index ac37a53…0ed306a 100644ac37a53 修改之前的 文件对象 0ed306a修改只会的文件对象。100644表示这是一个常规文件文件权限为 644# 通过 一下命令 可以看 指定 文件对象 的 当时状态 的 文件具体内容。gitcat-file-p61ea990第三行--- a/name.txt表示修改前的文件 b/name.txt表示修改后的文件第四行 -1,4 1,4 修改区域开头和结尾的 为固定格式。-1,4表示 这个 修改区域 的 范围 在 修改前的文件的 1~4行1,4表示 这个 修改区域 的 范围 在 修改完成之后 的文件的 1~4行。举例说明 -0,0 0,3 说明 修改之前文件为空 修改的具体操作 是 加了 3行代码。下面是 具体的改动 信息新增内容前面是加号 删除内容前面是减号 -:tom-alicejerry bily andy第五行\ No newline at end of file这个 文件 的改动信息 结束 进入 下一个 文件的改动信息 查看区。^_^ 本地分支落后远程时 Git push 失败的完整处理步骤一、场景复现push 失败的典型情况当远程分支已有他人推送的新提交你的本地分支未同步未 pull直接执行git push会触发rejected 错误核心报错信息如下# 典型报错提示To gitgithub.com:your-username/your-repo.git![rejected]main -main(non-fast-forward)error: failed to push some refs togitgithub.com:your-username/your-repo.githint: Updates were rejected because the remote contains work that youdonot have locally. hint: This is usually caused by another repository pushing to the same ref. You may want to hint: first integrate the remote changes(e.g.,git pull ...)before pushing again. hint: See theNote about fast-forwardsingit push --helpfordetails.此时 Git 强制要求先整合远程最新代码再执行 push。二、处理前先确认本地与远程的差异关键前置步骤在处理前建议先明确本地分支状态、落后的提交内容避免盲目操作步骤1查看本地分支当前状态# 查看本地分支的修改、跟踪状态gitstatus# 输出示例提示本地分支落后远程# On branch main# Your branch is behind origin/main by 2 commits, and can be fast-forwarded.# (use git pull to update your local branch)# nothing to commit, working tree clean步骤2拉取远程最新提交仅查看不整合先执行git fetch拉取远程最新代码仅下载不修改本地分支再对比差异# 拉取远程所有分支的最新提交不会改变本地代码gitfetch origin# 对比本地分支与远程分支的提交差异以 main 分支为例gitlog--onelineorigin/main ^main# 输出示例显示远程比本地多的提交# a1b2c3d (origin/main) 张三修复登录bug# d4e5f6g 李四新增用户列表功能三、核心处理两种 拉取、整合 方式1、merge2、rebase整合远程代码有两种核心方式都是通过pull.rebase配置而决定的以下是完整操作步骤方式1默认merge方式pull.rebasefalse适合新手/团队偏好保留完整提交历史含合并记录操作简单无提交历史改写风险。步骤1执行 git pull自动 merge 远程代码# 拉取远程main分支并merge到本地main默认行为等价于 git fetch git mergegitpull origin main# 若已设置本地分支跟踪远程分支git branch --set-upstream-toorigin/main main可简化为gitpull步骤2处理 merge 冲突若有如果你的本地修改与远程新提交冲突Git 会提示冲突文件示例如下# 冲突提示Auto-merging src/user.js CONFLICT(content): Merge conflictinsrc/user.js Automatic merge failed;fix conflicts andthencommit the result.冲突解决步骤打开冲突文件如src/user.js找到冲突标记// 冲突内容示例HEAD// 本地分支的代码functiongetUser(){returnlocal-user;}// 远程分支的代码functiongetUser(){returnremote-user;}origin/main修改为最终想要的代码删除冲突标记保留正确逻辑functiongetUser(){returnnew-user;}// 合并后的正确代码标记冲突文件为已解决并完成 merge 提交# 添加已解决冲突的文件gitaddsrc/user.js# 完成merge提交Git会自动生成合并提交信息直接保存即可gitcommit-mmerge: 解决user.js冲突整合远程最新代码步骤3验证 merge 结果# 查看提交历史能看到merge提交历史呈分支状gitlog--oneline--graph# 输出示例# * 789abc0 (HEAD - main) merge: 解决user.js冲突整合远程最新代码# |\# | * a1b2c3d (origin/main) 张三修复登录bug# | * d4e5f6g 李四新增用户列表功能# * 123defg 你的本地提交新增个人中心方式2rebase方式pull.rebasetrue适合追求线性提交历史无 merge 提交但需注意不要对已推送到远程的提交执行 rebase会改写历史影响协作。步骤1执行 git pull --rebase或提前配置默认rebase# 方式1临时执行rebase拉取gitpull--rebaseorigin main# 方式2提前配置默认rebase后续git pull自动用rebasegitconfig--globalpull.rebasetruegitpull# 配置后直接pull即可触发rebase步骤2处理 rebase 冲突若有rebase 过程中冲突会逐个提交触发示例提示# 冲突提示First, rewindingheadto replay your work ontopof it... Applying: 你的本地提交新增个人中心 Using index info to reconstruct a base tree... M src/user.js Falling back to patching base and3-way merge... Auto-merging src/user.js CONFLICT(content): Merge conflictinsrc/user.js error: Failed to mergeinthe changes. hint: Usegit am --show-current-patchto see the failed patch Resolve all conflicts manually, mark them as resolved withgit add/rm conflict_files,thenrungit rebase --continue.You can instead skip this commit: rungit rebase --skip.To abort and get back to the state beforegit rebase, rungit rebase --abort.冲突解决步骤打开冲突文件如src/user.js按方式1的方法修改冲突内容删除标记保留正确逻辑。标记冲突文件为已解决继续 rebase 流程# 添加已解决冲突的文件gitaddsrc/user.js# 继续rebase处理下一个提交若无更多冲突则完成gitrebase--continue# 可选若想跳过当前冲突的提交git rebase --skip# 可选若想放弃rebase回到操作前状态git rebase --abort步骤3验证 rebase 结果# 查看提交历史历史呈线性无merge提交gitlog--oneline--graph# 输出示例# * 901hij0 (HEAD - main) 你的本地提交新增个人中心# * a1b2c3d (origin/main) 张三修复登录bug# * d4e5f6g 李四新增用户列表功能# * 111aaa0 初始提交项目搭建四、推送代码到远程无论用 merge 还是 rebase 方式整合完成后本地分支已同步远程最新代码此时执行 push 即可成功# 推送本地main分支到远程maingitpush origin main# 若已设置跟踪分支简化为gitpush五、关键注意事项冲突处理核心原则冲突文件必须手动修改Git 无法自动判断业务逻辑修改后务必删除标记。解决冲突后merge 需执行git commitrebase 需执行git rebase --continue不可直接 push。rebase 慎用场景不要对已推送到远程的提交执行 rebase会改写历史导致协作方代码冲突。多人协作的公共分支如 main/develop优先用 merge 方式避免 rebase 改写历史。提前拉取习惯日常开发建议先执行git pull同步远程最新代码再做本地开发减少冲突概率。紧急回滚若处理过程中操作失误可通过git reflog查看历史操作恢复到指定状态# 查看操作日志找到目标提交的哈希值gitreflog# 恢复到指定状态如哈希值为 123defggitreset--hard123defg^_^ tag 标签本地仓库 打标签# 给当前最新的头版本打上标签 v1.0.0gittag v1.0.0# 给指定版本打上标签gittag v1.0.0 commitID# 如果需要给标签添加说明或注释可以使用 -a 参数和 -m 参数gittag-av1.0.0-m注释说明信息将 本地tag —推送到— 远程仓库gitpush origin v1.0.0查看# 查看打的所有标签gittag# 查看 Git 仓库中 指定标签 的 注释信息gitshow v1.0.0删除本地标签git tag -d v1.0 # 删除v1.0版本标签打该标签的版本无任何影响^_^ pull 和 fetch 区别# git pull 相当于 以下两个步骤的 集合gitfetch origin master // 从远程主机的master分支拉取最新内容gitmerge FETCH_HEAD // 将拉取下来的最新内容合并到当前所在的分支^_^ 分支管理1. 基本管理查# 查看本地分支gitbranch# 查看远程分支gitbranch-r# 查看本地和远程分支gitbranch-a增# 创建wtt分支(内容上当前分支的内容复制一份给创建的分支)gitbranch wtt# 将本地创建的 分支 同步到 远程gitpush --set-upstream origin wtt删# 删除本地分支gitbranch-dwtt# 会在删除前检查merge状态其与上游分支或者与headgitbranch-Dwtt# 是 git branch --delete --force的简写它会直接删除。# 删除远程分支gitpush origin--deletewtt合并gitmerge dev# 合并dev分支到 当前分支切换gitcheckout dev# 或 git switch dev 切换分支2. 在本地新建的aaa分支 并和 远程的bbb 建立连接# 查看 远程分支 有哪些 git branch -r # 将 远程分支 拉到本地 且 建立连接 和 在本地的一个分支 git checkout -b aaa origin/bbb这个命令 也可以实现 把 现有项目 的 其他远程分支 拉到本地。gitcheckout-b本地分支名 origin/远程分支名其中本地分支名为你想要创建的本地分支的名称远程分支名为你想要拉取的远程分支的名称。3. 默认分支git clone 的时候 默认拉取 的是 默认分支 代码gitclone gitgitee.com:Auth/ProjectName.git如果拉取指定分支的代码例如abc分支的代码则如此操作gitclone-babc gitgitee.com:Auth/ProjectName.git^_^ 变动保存1、基本使用git stash说明默认情况下会把 以下修改 存储到一个 stash栈中1、暂存区中的修改2、工作区中已经存在的文件的修改默认情况下不会存储下列文件1、工作区中新增的文件untracked files2、被版本库忽略的文件.gitignore 中定义的如果非要存储 新增的文件可以git stash -u如果非要存储 新增的文件 和 被版本库忽略的文件 可以使git stash -a执行 git stash 命令后具体表现为暂存区 中的修改看不见了,工作区 中已经存在的文件的修改也看不见了。注意stash栈中的内容可以被所有git分支访问2、stash备注git stash save 备注信息因为可以多次 向 堆栈中 stash 数据所以如果你想要在 git stash 时想像 commit -m “***” 一样添加一个 信息注解可以使用 save 选项.3、查看stashgit stash list # 查看全部的stash git stash show # 查看最近一次git stash 的 保存的 大概 内容 git stash show -p # 查看最近一次git stash 的 保存的 详细 内容 git stash show stash{id} # 产看指定 哪一次git stash 的 保存的大概内容stash 每次添加的代码都会到一个独立空间多个 stash通过 stash_id 进行区分4、将堆栈中的stash 代码 返回到 工作区不是暂存区复制 到工作区git stash apply # 将堆栈中的最近一次 stash放到工作区保留堆栈的内容 git stash apply stash{id} # 将堆栈中的指定 stash 放到工作区保留堆栈的内容剪切 到工作区git stash pop # 将堆栈中的最近一次 stash放到工作区删除堆栈的内容 git stash pop stash{id} # 将堆栈中的指定 stash 放到工作区删除堆栈的内容删除堆栈中的stashgit stash drop # 删除最近一次的stash git stash drop stash{id} # 删除指定的一次 stash git stash clear # 删除所有的 stash摘要 save、list、show、apply、pop、drop^_^ 配置ssh方便push 和 clone代码step1git config --global user.name “WHO”git config --global user.email “888888126.com”step2cd ls 》查看家目录下是否有.ssh目录,如果没有下面命令会自动生成一个ssh-keygen -t rsa -C “888888126.com” # 一路按回车说明:这个.ssh目录不只属于git 而是 用户密钥 的存储目录。step3进入.ssh目录你会看到两个文件id_rsa和id_rsa.pub,d_rsa是私钥id_rsa.pub自然就是公钥啦然后我们需要做的就是把id_rsa.pub文件中的内容拷贝一下 。step4进入你自己的github进入Settings-SSH and GPG keys-New SSH key,然后在Key那栏下面将第四步拷贝的东西粘贴进去就可以了最后点击 Add SSH key按钮添加。如果之前有配置过的公匙先删掉再将新的复制进去修改git的提交方式 https — ssh配置完ssh就可以把原有项目的提交方法 由 https 改为 ssh查看当前项目采用的提交方式git remote -v如果是https//就是采用的是https方式如果是git就是采用的是 ssh 的方式。删除原有的https方式(也就是原有的源)git remote rm origin查看原有的源是否删除成功 git remote以ssh的方式添加一个源 git remote add origin ssh链接此时可以再次查看 采用的提交方式。注意 切换了源不能简单的用 git push 提交而是要用git push --set-upstream origin master