首页 » 科学 » 3年 Git 运用心得 \u0026 常见问题整理「值得收藏」_分支_文件

3年 Git 运用心得 \u0026 常见问题整理「值得收藏」_分支_文件

乖囧猫 2025-01-06 10:36:28 0

扫一扫用手机浏览

文章目录 [+]

作者:秋日不落叶

转发链接:https://juejin.im/post/5ee649ff51882542ea2b5108

3年 Git 运用心得 \u0026 常见问题整理「值得收藏」_分支_文件 3年 Git 运用心得 \u0026 常见问题整理「值得收藏」_分支_文件 科学

Git 流程图

3年 Git 运用心得 \u0026 常见问题整理「值得收藏」_分支_文件 3年 Git 运用心得 \u0026 常见问题整理「值得收藏」_分支_文件 科学
(图片来自网络侵删)
Workspace:事情区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库配置 Git

# 配置全局用户$ git config --global user.name "用户名"$ git config --global user.email "git账号"# 配置别名$ git config --global alias.co checkout$ git config --global alias.ss status$ git config --global alias.cm commit$ git config --global alias.br branch$ git config --global alias.rg reflog# 这里只是美化 log 的输出,实际利用时可以在 git lg 后面加命令参数,如:git lg -10 显示最近10条提交$ 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 --global --unset alias.xxx$ git config --global --unset user.xxx 查看 Git 信息

# 查看系统配置$ git config --list# 查看用户配置$ cat ~/.gitconfig# 查看当前项目的 git 配置$ cat .git/config# 查看暂存区的文件$ git ls-files# 查看本地 git 命令历史$ git reflog# 查看所有 git 命令$ git --help -a# 查看当前 HEAD 指向$ cat .git/HEAD# git 中 D 向下翻一行 F 向下翻页 B 向上翻页 Q 退出# 查看提交历史$ git log --oneline --grep="关键字" --graph --all --author "username" --reverse -num -p --before= 1 day/1 week/1 "2019-06-06" --after= "2019-06-06" --stat --abbrev-commit --pretty=format:"xxx" # oneline -> 将日志记录一行一行的显示# grep="关键字" -> 查找日志记录中(commit提交时的注释)与关键字有关的记录# graph -> 记录图形化显示 !


# all -> 将所有记录都详细的显示出来# author "username" -> 查找这个作者提交的记录# reverse -> commit 提交记录顺序翻转# before -> 查找规定的韶光(如:1天/1周)之前的记录# num -> git log -10 显示最近10次提交 !


# stat -> 显示每次更新的文件修正统计信息,会列出详细文件列表 !


# abbrev-commit -> 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符 !


# pretty=format:"xxx" -> 可以定制要显示的记录格式 !


# p -> 显示每次提交所引入的差异(按 补丁 的格式输出)!


git reflog「显示的是一个 HEAD 指向发生改变的韶光列表」。
在你切换分支、用 git commit 进行提交、以及用 git reset 撤销 commit 时,HEAD指向会改变,但当你进行 git checkout -- <filename> 撤销或者 git stash 存储文件等操作时,HEAD 并不会改变,这些修正从来没有被提交过,因此 reflog 也无法帮助我们规复它们。
git reflog 不会永久保持,Git 会定期清理那些 “用不到的” 工具,不要指望几个月前的提交还一贯在那里。
git log 点线图「git 中一条分支便是一个指针,新建一条分支便是基于当前指针新建一个指针」「切换至某个分支 ,便是将 HEAD 指向某条分支(指针)」「切换至某个 commit ,便是将 HEAD 指向某个 commit」

符号阐明:

表示一个 commit|表示分支提高/表示分叉\表示合入|/表示新分支 Git 常用命令

# 查看事情区和暂存区的状态$ git status# 将事情区的文件提交到暂存区$ git add .# 提交到本地仓库$ git commit -m "本次提交解释"# add和commit的合并,便捷写法(未追踪的文件无法直接提交到暂存区/本地仓库)$ git commit -am "本次提交解释"# 将本地分支和远程分支进行关联$ git push -u origin branchName# 将本地仓库的文件推送到远程分支$ git push# 拉取远程分支的代码$ git pull origin branchName# 合并分支$ git merge branchName# 查看本地拥有哪些分支$ git branch# 查看所有分支(包括远程分支和本地分支)$ git branch -a# 切换分支$ git checkout branchName# 临时将事情区文件的修正保存至堆栈中$ git stash# 将之前保存至堆栈中的文件取出来$ git stash pop Git 常用命令详解add

将事情区的文件添加到暂存区

# 添加指定文件到暂存区(追踪新增的指定文件)$ git add [file1] [file2] ...# 添加指定目录到暂存区,包括子目录$ git add [dir]# 添加当前目录的所有文件到暂存区(追踪所有新增的文件)$ git add .# 删除事情区/暂存区的文件$ git rm [file1] [file2] ...# 停滞追踪指定文件,但该文件会保留在事情区$ git rm --cached [file]# 改名事情区/暂存区的文件$ git mv [file-original] [file-renamed]# Git 2.0 以下版本#只浸染于文件的新增和修正$ git add .#只浸染于文件的修正和删除$ gti add -u#浸染于文件的增编削$ git add -A# Git 2.0 版本$ git add . 等价于 $ git add -A 「git add .」 :「操作的工具是“当前目录”所有文件变更」,"." 表示当前目录。
会监控事情区的状态树,利用它会把事情区的「所有变革提交」到暂存区,包括文件内容修正(modified)以及新文件(new),但「不包括被删除的文件」。
「git add -u」 :「操作的工具是全体事情区已经跟踪的文件变更,无论当前位于哪个目录下」。
仅监控「已经被 add 的文件」(即 「tracked file」),它会将被修正的文件(包括文件删除)提交到暂存区。
git add -u 不会提交新文件(「untracked file」)。
(「git add --update」 的缩写)「git add -A」 :「操作的工具是“全体事情区”所有文件的变更,无论当前位于哪个目录下」。
是上面两个功能的合集(git add --all 的缩写)。
status

# 查看事情区和暂存区的状态$ git status commit

# 将暂存区的文件提交到本地仓库并添加提交解释$ git commit -m "本次提交的解释"# add 和 commit 的合并,便捷写法# 和 git add -u 命令一样,未跟踪的文件是无法提交上去的$ git commit -am "本次提交的解释"# 跳过验证连续提交$ git commit --no-verify$ git commit -n# 编辑器会弹出上一次提交的信息,可以在这里修正提交信息$ git commit --amend# 修复提交,同时修正提交信息$ git commit --amend -m "本次提交的解释"# 加入 --no-edit 标记会修复提交但不修正提交信息,编辑器不会弹出上一次提交的信息$ git commit --amend --no-edit git commit --amend 既可以修正上次提交的文件内容,也可以修正上次提交的解释。
会用一个新的 commit 更新并更换最近一次提交的 commit。
如果暂存区有内容,这个新的 commit 会把任何修正内容和上一个 commit 的内容结合起来。
如果暂存区没有内容,那么这个操作就只会把上次的 commit 重写一遍。
「永久不要修复一个已经推送到公共仓库中的提交,会谢绝推送到仓库」push & pull分支推送顺序的写法是 「<来源地>:<目的地>」

# 将本地仓库的文件推送到远程分支# 如果远程仓库没有这个分支,会新建一个同名的远程分支# 如果省略远程分支名,则表示两者同名$ git push <远程主机名> <本地分支名>:<远程分支名>$ git push origin branchname# 如果省略本地分支名,则表示删除指定的远程分支# 由于这等同于推送一个空确当地分支到远程分支。
$ git push origin :master# 等同于$ git push origin --delete master# 建立当前分支和远程分支的追踪关系$ git push -u origin master# 如果当前分支与远程分支之间存在追踪关系# 则可以省略分支和 -u$ git push# 不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机$ git push --all origin# 拉取所有远程分支到本地镜像仓库中$ git pull# 拉取并合并项目其他职员的一个分支$ git pull origin branchname# 等同于 fetch + merge$ git fetch origin branchName$ git merge origin/branchName# 如果远程主机的版本比本地版本更新,推送时 Git 会报错,哀求先在本地做 git pull 合并差异,# 然后再推送到远程主机。
这时,如果你一定要推送,可以利用 –-force 选项# (只管即便避免利用)$ git push --force origin | git push -f origin
branch

# 查看本地分支$ git branch | git branch -l# 查看远程分支$ git branch -r# 查看所有分支(本地分支+远程分支)$ git branch -a# 查看所有分支并带上最新的提交信息$ git branch -av# 查看本地分支对应的远程分支$ git branch -vv# 新建分支# 在别的分支下新建一个分支,新分支会复制当前分支的内容# 把稳:如果当前分支有修正,但是没有提交到仓库,此时修正的内容是不会被复制到新分支的$ git branch branchname# 切换分支(切换分支时,本地事情区,仓库都会相应切换到对应分支的内容)$ git checkout branchname# 创建一个 aaa 分支,并切换到该分支 (新建分支和切换分支的简写)$ git checkout -b aaa# 可以看做是基于 master 分支创建一个 aaa 分支,并切换到该分支$ git checkout -b aaa master# 新建一条空分支(详情请看问题列表)$ git checkout --orphan emptyBranchName$ git rm -rf .# 删除本地分支,会阻挡删除包含未合并变动的分支$ git brnach -d branchname# 逼迫删除一个本地分支,纵然包含未合并变动的分支$ git branch -D branchname# 删除远程分支# 推送一个空分支到远程分支,实在就相称于删除远程分支$ git push origin :远程分支名# 或者$ git push origin --delete 远程分支名# 修合法前分支名$ git branch -m branchname merge 三种常用合并方法

# 默认 fast-forward ,HEAD 指针直接指向被合并的分支$ git merge# 禁止快进式合并$ git merge --no-ff$ git merge --squash

fast-forward:会在当前分支的提交历史中添加进被合并分支的提交历史(「得先理解什么时候会发生快速合并,并不是每次 merge 都会发生快速合并」);--no-ff:「会天生一个新的提交」,让当前分支的提交历史不会那么乱;--squash:「不会天生新的提交」,会将被合并分支多次提交的内容直接存到事情区和暂存区,由开拓者手动去提交,这样当前分支终极只会多出一条提交记录,不会掺杂被合并分支的提交历史rebase

https://www.liaoxuefeng.com/wiki/896043488029600/1216289527823648

https://git-scm.com/book/zh/v2/Git-%E5%88%86%E6%94%AF-%E5%8F%98%E5%9F%BA

https://www.jianshu.com/p/4a8f4af4e803

https://juejin.im/post/5a54386af265da3e3b7a6317#heading-9

stash能够将所有未提交的修正保存至堆栈中,用于后续规复当前事情区内容如果文件没有提交到「暂存区(利用 git add . 追踪新的文件)」,利用该命令会提示 No local changes to save ,无法将修正保存到堆栈中

「利用场景:」 当你接到一个修复紧急 bug 的任务时候,一样平常都是先创建一个新的 bug 分支来修复它,然后合并,末了删除。
但是,如果当前你正在开拓功能中,短韶光还无法完成,无法直接提交到仓库,这时候可以先把当前事情区的内容 git stash 一下,然后去修复 bug,修复后,再 git stash pop,规复之前的事情内容。

# 将所有未提交的修正(提交到暂存区)保存至堆栈中$ git stash# 给本次存储加个备注,以防韶光久了忘了$ git stash save "存储"# 存储未追踪的文件$ git stash -u# 查看存储记录$ git stash list在 Windows 上和 PowerShell 中,须要加双引号# 规复后,stash 记录并不删除$ git stash apply "stash@{index}"# 规复的同时把 stash 记录也删了$ git stash pop "stash@{index}"# 删除 stash 记录$ git stash drop "stash@{index}"# 删除所有存储的进度$ git stash clear# 查看当前记录中修正了哪些文件$ git stash show "stash@{index}"# 查看当前记录中修正了哪些文件的内容$ git stash show -p "stash@{index}" diff

# 查看事情区和暂存区单个文件的比拟$ git diff filename# 查看事情区和暂存区所有文件的比拟$ git diff# 查看事情区和暂存区所有文件的比拟,并显示出所有有差异的文件列表$ git diff --stat# 把稳:# 1.你修正了某个文件,但是没有提交到暂存区,这时候会有比拟的内容# 一旦提交到暂存区,就不会有比拟的内容(由于暂存区已经更新)# 2.如果你新建了一个文件,但是没有提交到暂存区,这时候 diff 是没有结果的# 查看暂存区与上次提交到本地仓库的快照(即最新提交到本地仓库的快照)的比拟$ git diff --cached/--staged# 查看事情区与上次提交到本地仓库的快照(即最新提交到本地仓库的快照)的比拟$ git diff branchname# 查看事情区与 HEAD 指向(默认当前分支最新的提交)的比拟$ git diff HEAD# 查看两个本地分支中某一个文件的比拟$ git diff branchname..branchname filename# 查看两个本地分支所有的比拟$ git diff branchname..branchname# 查看远程分支和本地分支的比拟$ git diff origin/branchname..branchname# 查看远程分支和远程分支的比拟$ git diff origin/branchname..origin/branchname# 查看两个 commit 的比拟$ git diff commit1..commit2 remote

# 查看所有远程主机$ git remote# 查看关联的远程仓库的详细信息$ git remote -v# 删除远程仓库的 “关联”$ git remote rm projectname# 设置远程仓库的 “关联”$ git remote set-url origin <newurl> tag

常用于发布版本

https://www.liaoxuefeng.com/wiki/896043488029600/902335212905824

# 默认在 HEAD 上创建一个标签$ git tag v1.0# 指定一个 commit id 创建一个标签$ git tag v0.9 f52c633# 创建带有解释的标签,用 -a 指定标署名,-m 指定解释笔墨$ git tag -a v0.1 -m "version 0.1 released"# 查看所有标签# 把稳:标签不是按韶光顺序列出,而是按字母排序的。
$ git tag# 查看单个标签详细信息$ git show <tagname># 推送一个本地标签$ git push origin <tagname># 推送全部未推送过确当地标签$ git push origin --tags# 删除本地标签# 由于创建的标签都只存储在本地,不会自动推送到远程。
# 以是,打错的标签可以在本地安全删除。
$ git tag -d v0.1# 删除一个远程标签(先删除本地 tag ,然后再删除远程 tag)$ git push origin :refs/tags/<tagname>
删除文件

# 删除暂存区和事情区的文件$ git rm filename# 只删除暂存区的文件,不会删除事情区的文件$ git rm --cached filename

如果该配置 .gitignore 文件之前就把某个文件上传到远程仓库了,这时候想把远程仓库中的该文件删除,此时你配置 .gitignore 文件也没有用,由于该文件已经被追踪了,但又不想在本地删除该文件后再重新提交到远程仓库,这时候可以利用 git rm --cached filename 命令取消该文件的追踪,这样下次提交的时候,git 就不会再提交这个文件,从而远程仓库的该文件也会被删除

版本切换 & 重设 & 撤销「checkout 可以撤销事情区的文件,reset 可以撤销事情区/暂存区的文件」「reset 和 checkout 可以浸染于 commit 或者文件,revert 只能浸染于 commit」checkout 详解

# 规复暂存区的指定文件到事情区$ git checkout <filename># 规复暂存区的所有文件到事情区$ git checkout .# 回滚到最近的一次提交# 如果修正某些文件后,没有提交到暂存区,此时的回滚是回滚到上一次提交# 如果是已经将修正的文件提交到仓库了,这时再用这个命令回滚无效# 由于回滚到的是之前自己修正后提交的版本$ git checkout HEAD$ git checkout HEAD -- filename# 回滚到最近一次提交的上一个版本$ git checkout HEAD^# 回滚到最近一次提交的上2个版本$ git checkout HEAD^^# 切换分支,在这里也可以看做是回到项目「当前」状态的办法$ git checkout <当前你正在利用的分支># 切换到某个指定的 commit 版本$ git checkout <commit_id># 切换指定 tag$ git checkout <tag> 「在开拓的正常阶段,HEAD 一样平常指向 master 或是其他确当地分支,但当你利用 git checkout <commit id> 切换到指定的某一次提交的时候,HEAD 就不再指向一个分支了——它直接指向一个提交,HEAD 就会处于 detached 状态(游离状态)」。
切换到某一次提交后,你可以查看文件,编译项目,运行测试,乃至编辑文件而不须要考虑是否会影响项目的当前状态,你所做的统统都不会被保存到主栈的仓库中。
当你想要回到主线连续开拓时,利用 git checkout branchName 回到项目初始的状态(「这时候会提示你是否须要新建一条分支用于保留刚才的修正」)。
「哪怕你切换到了某一版本的提交,并且对它做了修正后,欠妥心提交到了暂存区,只要你切换回分支的时候,依然会回到项目的初始状态。
(把稳:你所做的修正,如果 commit 了,会被保存到那个版本中。
切换完分支后,会提示你是否要新建一个分支来保存刚才修正的内容。
如果你刚才办理了一个 bug ,这时候可以新建一个临时分支,然后你本地自己的开拓主分支去合并它,合并完后删除临时分支)。
」「一样平常我都是用 checkout 回退版本,查看历史代码,测试 bug 在哪」

reset 详解

git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]:将当前的分支重设(reset)到指定的 <commit> 或者 HEAD (默认,如果不显示指定 <commit>,默认是 HEAD ,即最新的一次提交),并且根据 [mode] 有可能更新索引和事情目录。
mode 的取值可以是 hard、soft、mixed、merged、keep 。

# 从暂存区撤销特定文件,但不改变事情区。
它会取消这个文件的暂存,而不覆盖任何变动$ git reset <fileName># 重置暂存区最近的一次提交,但事情区的文件不变$ git reset# 等价于$ git reset HEAD (默认)# 重置暂存区与事情区,回退到最近一次提交的版本内容$ git reset --hard# 重置暂存区与事情区,回退到最近一次提交的上一个版本$ git reset --hard HEAD^# 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),同时重置暂存区,但事情区不变$ git reset <commit># 等价于$ git reset --mixed <commit># 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),但保持暂存区和事情区不变$ git reset --soft <commit># 将当前分支的指针指向为指定 commit(该提交之后的提交都会被移除),同时重置暂存区、事情区$ git reset --hard <commit>
git reset 有很多种用法。
它可以被用来移除提交快照,只管它常日被用来撤销暂存区和事情区的修正。
不管是哪种情形,它该当只被用于本地修正——你永久不应该重设和其他开拓者共享的快照。
「当你用 reset 回滚到了某个版本后,那么不才一次 git 提交时,之前该版本后面的版本会被作为垃圾删掉。
」「当我们回退到一个旧版本后,此时再用 git log 查看提交记录,会创造之前的新版本记录没有了。
如果第二天,你又想规复到新版本怎么办?找不到新版本的 commit_id 怎么办?」

「我们可以用 git reflog 查看历史命令,这样就可以看到之前新版本的 commit_id ,然后 git reset --hard commit_id 就可以回到之前的新版本代码」

虽然可以用 git reflog 查看本地历史,然后回答到之前的新版本代码,但是在别的电脑上是无法获取你的历史命令的,以是这种方法不屈安。
万一你的电脑溘然坏了,这时候就无法回到未来的版本。
revert 详解

# 天生一个撤销最近的一次提交的新提交$ git revert HEAD# 天生一个撤销最近一次提交的上一次提交的新提交$ git revert HEAD^# 天生一个撤销最近一次提交的上两次提交的新提交$ git revert HEAD^^# 天生一个撤销最近一次提交的上n次提交的新提交$ git revert HEAD~num# 天生一个撤销指定提交版本的新提交$ git revert <commit_id># 天生一个撤销指定提交版本的新提交,实行时不打开默认编辑器,直策应用 Git 自动天生的提交信息$ git revert <commit_id> --no-edit

git revert命令用来「撤销某个已经提交的快照(和 reset 重置到某个指定版本不一样)」。
它是在提交记录末了面加上一个撤销了变动的新提交,而不是从项目历史中移除这个提交,这避免了 Git 丢失项目历史。

「撤销(revert)该当用在你想要在项目历史中移除某个提交的时候」。
比如说,你在追踪一个 bug,然后你创造它是由一个提交造成的,这时候撤销就很有用。

「撤销(revert)被设计为撤销公共提交的安全办法,重设(reset)被设计为重设本地变动。

由于两个命令的目的不同,它们的实现也不一样:重设完备地移除了一堆变动,而撤销保留了原来的变动,用一个新的提交来实现撤销。
「千万不要用 git reset 回退已经被推送到公共仓库上的 提交,它只适用于回退本地修正(从未提交到公共仓库中)。
如果你须要修复一个公共提交,最好利用 git revert」。

发布一个提交之后,你必须假设其他开拓者会依赖于它。
移除一个其他团队成员在上面连续开拓的提交在协作时会引发严重的问题。
当他们试着和你的仓库同步时,他们会创造项目历史的一部分溘然消逝了。
一旦你在重设之后又增加了新的提交,Git 会认为你确当地历史已经和 origin/master 分叉了,同步你的仓库时的合并提交(merge commit)会使你的同事困惑。

cherry-pick

「将指定的提交 commit 运用于当前分支」(可以用于规复欠妥心撤销(revert/reset)的提交)

$ git cherry-pick <commit_id>$ git cherry-pick <commit_id> <commit_id>$ git cherry-pick <commit_id>^..<commit_id> git submodule 子模块

有种情形我们常常会碰着:某个事情中的项目须要包含并利用另一个项目。
大概是第三方库,或者你独立开拓的,用于多个父项目的库。
现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中利用另一个。
如果将其余一个项目中的代码复制到自己的项目中,那么你做的任何自定义修正都会使合并上游的改动变得困难。
「Git 通过子模块来办理这个问题,许可你将一个 Git 仓库作为另一个 Git 仓库的子目录。
它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。

# 在主项目中添加子项目,URL 为子模块的路径,path 为该子模块存储的目录路径git submodule add [URL] [Path]# 克隆含有子项目的主项目git clone [URL]# 当你在克隆这样的项目时,默认会包含该子项目的目录,但该目录中还没有任何文件# 初始化本地配置文件git submodule init# 从当前项目中抓取所有数据并检出父项目中列出的得当的提交git submodule update# 等价于 git submodule init && git submodule updategit submodule update --init# 自动初始化并更新仓库中的每一个子模块, 包括可能存在的嵌套子模块git clone --recurse-submodules [URL] 新建一个 Git 项目的两种办法1.本地新建好 Git 项目,然后关联远程仓库

# 初始化一个Git仓库$ git init# 关联远程仓库$ git remote add <name> <git-repo-url># 例如$ git remote add origin https://github.com/xxxxxx 2.clone 远程仓库

# 新建好远程仓库,然后 clone 到本地$ git clone <git-repo-url># 将远程仓库下载到(当前 git bash 启动位置下面的)指定文件中,如果没有会自动天生$ git clone <git-repo-url> <project-name> Git 分支管理规范

https://blog.csdn.net/LitongZero/article/details/106188138

https://juejin.im/post/5b4328bbf265da0fa21a6820

实际开拓的时候,一人一条分支(个人见地:除非是大项目,参与的开拓职员很多时,可以采取 feature 分支,否则一样平常的项目中,一个开拓者一条分支够用了)。
除此之外还要有一条 develop 开拓分支,一条 test 测试分支,一条 release 预发布分支。
「develop」:「开拓分支」,开拓职员每天都须要拉取/提交最新代码的分支;「test」:「测试分支」,开拓职员开拓完并自测通过后,发布到测试环境的分支;「release」:「预发布分支」,测试环境测试通过后,将测试分支的代码发布到预发环境的分支(「这个得看公司支不支持预发环境,没有的话就可以不采取这条分支」);「master」:「线上分支」,预发环境测试通过后,运营/测试会将此分支代码发布到线上环境;大致流程:开拓职员每天都须要拉取/提交最新的代码到 「develop 分支」;开拓职员开拓完毕,开始 「集成测试」,测试无误后提交到 「test 分支」并发布到测试环境,交由测试职员测试;测试环境通过后,发布到 「release 分支」 上,进行预发环境测试;预发环境通过后,发布到 「master 分支」上并打上标签(tag);如果线上分支出了 bug ,这时候干系开拓者该当基于预发布分支(「没有预发环境,就利用 master 分支」),新建一个 「bug 分支」用来临时办理 bug ,处理完后申请合并到 预发布 分支。
这样做的好处便是:不会影响正在开拓中的功能。

「预发布环境的浸染:」 预发布环境是正式发布前末了一次测试。
由于在少数情形下纵然预发布通过了,都不能担保正式生产环境可以100%不出问题;预发布环境的配置,数据库等都是跟线上一样;有些公司的预发布环境数据库是连接线上环境,有些公司预发布环境是单独的数据库;如果不设预发布环境,如果开拓合并代码有问题,会直接将问题发布到线上,增加掩护的本钱。

Git 钩子Git 基本已经成为项目开拓中默认的版本管理软件,在利用 Git 的项目中,我们可以为项目设置 Git Hooks 来帮我们在提交代码的各个阶段做一些代码检讨等事情钩子(Hooks) 都被存储在 Git 目录下的 hooks 子目录中。
也便是绝大部分项目中的 .git/hook 目录钩子分为两大类,客户真个和做事器真个客户端钩子紧张被提交和合并这样的操作所调用而做事器端钩子浸染于吸收被推送的提交这样的联网操作,这里紧张先容客户端钩子4.1 pre-commitpre-commit 便是在代码提交之前做些东西,比如代码打包,代码检测,称之为钩子(hook)在 commit 之前实行一个函数(callback)。
这个函数成功实行完之后,再连续 commit,但是失落败之后就阻挡 commit在 .git->hooks->下面有个 pre-commit.sample ,这个里面便是默认的函数(脚本)样本4.2 安装 pre-commit

npm install pre-commit --save-dev 4.3 配置脚本

「如果没有在 .git->hooks 目录下天生 pre-commit 文件的话,则要手工创建 node ./node_modules/pre-commit/install.js」

"scripts": { "build": "tsc", "eslint": "eslint src --ext .ts", "eslint:fix": "eslint src --ext .ts --fix" }, //在提交代码之前,先实行 scripts 中的 eslint 命令 "pre-commit": [ "eslint" ] 4.4 跳过 pre-commit 连续提交代码

# 跳过验证$ git commit --no-verify$ git commit -n

更多钩子:https://git-scm.com/book/zh/v2/

常见问题1、拉取别人的远程分支合并后,git 会存取这个拉取的记录,如果你欠妥心删了别人的上传的文件,这时候想要再拉取别人的分支是没用的,会显示 already-up

这时候可以回滚代码,重新拉取。

2、以前有过这样的经历:前后端、客户真个代码都存放在一个 git 仓库中,在根目录下各悛改建项目目录。
那么可以直接在自己的项目目录下利用 git 提交代码并且在各自的项目目录下配置 .gitignore 文件,不用在根目录下配置 .gitignore 文件,这样就互不影响了3、fatal:refusing to merge unrelated histories 谢绝合并不干系的历史

在 git 2.9.2 之后,不可以合并没有相同结点的分支(分支之间自仓库建立后,从来没有过相互拉取合并)。
如果须要合并两个不同结点的分支,如下:

$ git pull origin branchName --allow-unrelated-histories$ git merge branchName --allow-unrelated-histories

这个功能是可以让大家不要把仓库上传错了,如果会加上这个代码,那么便是自己确定了上传。
旧版本的 Git 很随意马虎就把代码传错了,现在可以看到,如果上传的不是之前的,那么就须要加代码上传。
正常情形下,都是先建立仓库,然后切多个分支,分支先去拉取合并主分支的内容,然后再各自开拓, 如果建立仓库后,各个分支没有区拉取主分支的代码,之后各个分支之间想要合并时就会报错。

4、合并分支时涌现问题,想要解除合并状态

error: merge is not possible because you have unmerged files.hint: Fix them up in the work tree, and then use 'git add/rm <file>'hint: as appropriate to mark resolution and make a commit.fatal: Exiting because of an unresolved conflict.

当远程分支和本地分支发生冲突后,git 保持合并状态,你如果没有去办理完所有的冲突,那么 git 会一贯保持这个状态,你就无法再提交代码。
只有先解除合并状态后,才能连续提交。
实行命令前最好先备份一下,有可能本地做的修正会被远程分支覆盖掉。

# 解除合并状态$ git merge --abort5、欠妥心把某些文件上传到远程 git 仓库/想要删除远程仓库中的文件

# 删除暂存区和事情区的文件$ git rm filename# 只删除暂存区的文件,不会删除事情区的文件$ git rm --cached filename

如果该配置 .gitignore 文件之前就把某个文件上传到远程仓库了,这时候想把远程仓库中的该文件删除,此时你配置 .gitignore 文件也没有用,由于该文件已经被追踪了,但又不想在本地删除该文件后再重新提交到远程仓库,这时候可以利用 git rm --cached filename 命令取消该文件的追踪,这样下次提交的时候,git 就不会再提交这个文件,从而远程仓库的该文件也会被删除

6、将本地新建的项目上传到新建的远程仓库上

之前没有进行过关联,即没有通过 clone 远程项目到本地再开始做项目,而是先本地新建了一个项目,然后想传到远程仓库上。

# 将本地仓库和远程仓库关联起来$ git remote add origin 远程仓库地址# 将本地的 master 分支推送到 origin 主机,同时指定 origin 为默认主机$ git push -u origin master# 上面的命名实行后,下次再从本地库上传内容的时候只需下面这样就可以了$ git push7、HEAD 指针既可以指向分支(默认指向当前分支),也可以指向快照,当指向的是快照时,这个时候指针的状态称之为游离状态(detached)8、创建与合并分支的事理

https://www.liaoxuefeng.com/wiki/896043488029600/900003767775424

9、每次 git push 都要输入用户名、密码step 1:天生公钥

ssh-keygen -t rsa -C "xxxxx@xxxxx.com"# Generating public/private rsa key pair...# 三次回车即可天生 ssh keystep 2:查看已天生的公钥

cat ~/.ssh/id_rsa.pubstep3:复制已天生的公钥添加到 git 做事器

测试 ssh 是否能够连接成功

$ ssh -T git@github.com step4:利用 ssh 协议 clone 远程仓库 或者 如果已经用 https 协议 clone 到本地了,那么就重新设置远程仓库

「利用 ssh 协议」

$ git remote set-url origin git@xxx.com:xxx/xxx.gitstep5:创建文件存储用户名和密码

一样平常为 C:\users\Administrator,也可以是你自己创建的系统用户名目录,文件名为 .git-credentials。
由于在 Windows 中不许可直接创建以 "." 开头的文件,以是用命令行创建该文件。

$ touch .git-credentials$ echo "http://{username}:{password}@github.com" >> ~/.git-credentials$ git config --global credential.helper store10、git 不许可提交空文件夹

可以在当前目录下,添加一个 .gitkeep 文件

11、有时候复制过来的文件,利用 git add . 无法进行文件追踪,可以利用 git add -A ,这也便是每次提交前都要 git status 的缘故原由12、同一台电脑配置多个 git 账号

https://github.com/jawil/notes/issues/2

13、Another git process seems to be running in this repository, e.g.

缘故原由在于 Git 在利用过程中遭遇了奔溃,部分被上锁资源没有被开释导致的。

「办理方案:」 进入项目文件夹下的 .git 文件中(显示隐蔽文件夹或 rm .git/index.lock)删除 index.lock 文件即可。

14、git commit -am "xxx" 有时候会失落效,无法提交所有的修正

git commit -am "xxx" 只会将被 「tracked」 的文件添加到暂存区并提交,而将文件添加到 git 管理是要利用 git add 命令,将新的文件「tracked」 。
(新建了文件之后,idea 会提示你是否须要加到 git 管理中。
选择记住后,之后 idea 默认都会把新建的文件 「tracked」 化)

15、git merge --no-ff 的浸染「禁止快进式(fast-forward)合并,会天生一个新的提交」

从合并后的代码来看,结果都是一样的,差异就在于 --no-ff 会让 git 天生一个新的提交工具。
为什么要这样?常日我们把 master 作为主分支,上面存放的都是比较稳定的代码,提交频率也很低,而 feature 是用来开拓特性的,上面会存在许多零星的提交,快进式合并会把 feature 的提交历史混入到 master 中,搅乱 master 的提交历史。
以是如果你根本不在意提交历史,也不爱管 master 干不干净,那么 --no-ff 实在没什么用。

https://segmentfault.com/q/1010000002477106

16、git merge 与 git rebase 的差异

https://juejin.im/post/5a54386af265da3e3b7a6317#heading-9

https://blog.csdn.net/liuxiaoheng1992/article/details/79108233

https://segmentfault.com/a/1190000012897637?utm_source=tag-newest#articleHeader0

https://segmentfault.com/a/1190000018580144?utm_source=tag-newest

17、git log 无法正常显示中文

# 试试$ git -c core.pager=more log# 如果可以显示中文的话,把 pager 设置为 more$ git config --global core.pager more

https://www.zhihu.com/question/57162172

https://www.playpi.org/2019031901.html

18、git merge -m "xxx" 的时候可以附加信息默认是 Merge branch branchName

19、git pull 会拉取所有远程分支的代码到本地镜像仓库中

想要 merge 别人的分支是:

如果你确当地仓库中已经有了他人的分支(直接切换到他人分支,就会在本地天生一条他人的分支),就可以利用 merge branchname;如果你确当地仓库没有他人的分支,那么就得利用 merge origin/branchname 来合并

20、git branch -r/-a/-l 查看的都是本地镜像仓库中的分支,如果本地镜像仓库没有拉取远程仓库的代码,此时别人新推了一个分支到远程仓库,你这时候是查看不到这条新推的分支的21、git stash 存储未追踪的文件如果我们新建了文件,但是没有用 git add . 追踪文件,那么 git stash 是无法存储的

$ git stash -u22、如何在 github 上 pr 项目

segmentfault.com/a/119000002…

23、git push 无法提交代码

「可能涌现的报错:」

「remote:」 Permission to xxxxx.git denied to xxx. fatal: unable to access 'github.com/ xxxxx.git/': The requested URL returned error: 403「remote:」 You do not have permission to push to the repository via HTTPS「fatal:」 Authentication failed for 'gitee.com/xxx.git/'

# 查看当前项目的 git 配置$ cat .git/config查看本地项目的 .git/config 设置的仓库 url 地址和 github 利用的链接地址是否同等。
git push 的数据协议有两种办法:ssh 和 https。
如果不一致就须要切换 url 地址。

24、git 输错用户名和密码,后续的 git 操作一贯报错

remote: Coding 提示: Authentication failed.remote: 认证失落败,请确认您输入了精确的账号密码。
fatal: Authentication failed for 'https://e.coding.net/xxx.git/'

在掌握面板里找到凭据管理器,选中 Windows 凭据,找到 git 的凭据,点击编辑,输入所用 github 的精确用户名和密码。

25、lint-staged 失落败

可能你的项目名路径中包含了中文名,须要更换成英文名

26、查看 git 安装目录「Mac:」 在命令行中输入 which git,就会显示 git 的安装位置了「Windows:」 打开cmd,输入 where git,就会显示 git 的安装路径了27、Git中用vim打开、修正、保存文件28、windows10 无法编辑 vimrc29、Windows下Git Bash中VIM打开文件中文乱码30、如何修正旧的 commit 的 message/如何将多个 commit 合成一个 commit/如何将多个间隔的 commit 合成一个 commit/

git rebase -i31、如果两个人都对某个文件进行了修正,一个是重命名文件,一个是修正文件内容,那么会起冲突吗?git 很智能,会自动合并这些修正

如果两个人都对同一个文件重命名,此时会起冲突,git 不会自动处理,须要开拓者自身去办理冲突

32、git revert 失落败:error: Commit faulty merge is a merge but no -m option was given、error: option `mainline' expects a number greater than zero

segmentfault.com/a/119000001…

www.jianshu.com/p/3719dae37…

git revert -m 133、git 创建一个空的分支

在 Git 中创建分支,是必须有一个父节点的,也便是说必须在已有的分支上来创建新的分支,如果工程已经进行了一段韶光,这个时候是无法创建空分支的。
但是有时候便是须要创建一个空缺的分支。

$ git checkout --orphan emptyBranchName

该命令会天生一个叫 emptybranch 的分支,该分支会包含父分支的所有文件。
但新的分支不会指向任何以前的提交,便是它没有历史,如果你提交当前内容,那么这次提交便是这个分支的首次提交。

想要空分支,以是须要把当前内容全部删除,用 git 命令

$ git rm -rf . // 把稳:末了的‘.’不能少。
34、如何清空一个分支的所有提交

先删除该分支,然后再新建一个空的分支(分支名便是删除的分支名)~~

推举Git学习干系文章

网络一份Git 非常处理清单「值得收藏」

Git命令的进阶和复习「动图效果」

一文彻底搞懂Git分支合并「实践」

给自己点韶光再记记这200条Git命令

手把手教你详细图文深入git 高等用法【实践】

手把手教你如何进阶成公司 Git 小好手(常见问题总结)

程序员都要节制的 Git 利用技巧【实践】

详细讲解高频利用的 Git 命令

「转」Svn和Git比较系列教程大纲汇总-值得收藏

事情流一览无余,看小姐姐用动图展示 10 大 Git 命令【图文】

作者:秋日不落叶

转发链接:https://juejin.im/post/5ee649ff51882542ea2b5108

标签:

相关文章

凡科网,引领企业数字化转型的先锋力量

随着互联网的快速发展,数字化转型已经成为企业发展的必然趋势。在这个时代背景下,凡科网应运而生,成为企业数字化转型的先锋力量。本文将...

科学 2025-01-08 阅读0 评论0

凌城镇,历史文化与现代发展的完美融合

凌城镇,一座历史悠久、文化底蕴深厚的城市,位于我国东南部。近年来,随着我国经济的快速发展,凌城镇在传承历史文化的也在不断推进现代化...

科学 2025-01-08 阅读0 评论0