首页系统综合问题从工作到现在Git操作总结

从工作到现在Git操作总结

时间2023-02-06 01:42:23发布分享专员分类系统综合问题浏览251

今天小编给各位分享possible的知识,文中也会对其通过从工作到现在Git操作总结和基本git命令总结等多篇文章进行知识讲解,如果文章内容对您有帮助,别忘了关注本站,现在进入正文!

内容导航:

  • 从工作到现在Git操作总结
  • 基本git命令总结
  • Git工作流程和常用命令分享
  • Git 经典操作场景,专治不会合代码
  • 一、从工作到现在Git操作总结

    转自:掘金 - 前端布吉岛

    https://juejin.cn/post/6891146425590087693

    写在前面

    你使用过 Git 吗?或许你还未接触过Git,或许你已经使用了一段时间,但它或许仍然令你困惑。

    本文主要讲解自己学习Git的方法以及解决自己遇见的各种Git问题。

    如果大家还想对Git有更深一步的研究可以访问 Git-book。

    https://git-scm.com/book/zh/v2

    Git常用命令git四连
    git add . 将所有改动放进暂存区git commit -m "描述" 提交并附带概要信息git pull 从远程仓库拉去代码git push 推送代码到远程仓库(master分支)

    其余常用命令
    git log 查看日志git log -p 查看详细历史git log --stat 查看简要统计git status 查看工作区状态git branch 名称 创建分支git checkout 名称 切换分支git checkout -b 名称 创建并切换到新分支git branch -d 名称 删除该分支(不能删除当前所在的分支,不能删除没有合并到master上的分支)git branch -D 名称 删除该分支(可以删除没有合并到master上的分支)git commit --amend 对最新的一条commit进行修正git reset --hard HEAD^ 丢弃最新提交(未提交的内容会被擦掉)git reset --soft HEAD^ 丢弃最新提交(未提交的内容不会被擦掉)git revert HEAD^ 回到某个commitgit rebase 目标基础点 重新设置基础点git merge 名称 将分支合并到head指向的分支git push origin localbranch 将代码推送到远程仓库的指定分支git push -d origin branchName 删除远程分支git stash 暂存代码git stash pop 弹出暂存代码

    配置别名

    对常用的一些命令进行别名配置,提升自己的工作效率

    git config --global alias.st status git status ==> git stgit config --global alias.ci commit git commit ==> git cigit config --global alias.co checkout git checkout ==> git cogit config --global alias.br branch git branch ==> git brgit config --global alias.sh stash git stash ==> git shgit config --global alias.pop "stash pop" git stash pop ==> git pop

    常见问题以及解决办法git clone失败报错提示
    Could not read from remote repository.Please make sure you have the correct access rights

    报错原因

    SSH key失效 或者 自己没有权限

    解决办法(一)——重新添加SSH key

    1.ssh-keygen -t rsa -C "username" (注:username为你git上的用户名)

    2.Generating public/private rsa key pair.Enter file in which to save the key (C:\Users\灏忛┈/.ssh/id_rsa): 直接回车

    3.C:\Users\灏忛┈/.ssh/id_rsa already exists.Overwrite (y/n)? y 输入y

    4.Enter same passphrase again: 直接回车

    5.Your identification has been saved in C:\Users\灏忛┈/.ssh/id_rsa. 私钥保存的地址Your public key has been saved in C:\Users\灏忛┈/.ssh/id_rsa.pub. 公钥保存地址

    6.根据路径找到公钥,将公钥添加到Git上

    解决办法(二)—— 使用http的地址进行克隆

    使用这种方式的话需要输入自己的账号以及密码,有点麻烦,不建议使用

    git pull失败(一)报错提示
    Your local changes to the following files would be overwritten by merge:

    报错原因

    其他人修改了该文件提交到版本库中,而我本地也修改了该文件,致使拉去代码的时候发生冲突

    解决办法——贮存更改

    依次进行如下操作

    git stash将工作区恢复到上次提交的内容,同时备份本地所做的修

    git pull拉取

    git stash pop弹出自己最近保存的内容

    查看对应文件 解决冲突

    然后git 三连提交自己的代码

    git pull失败(二)报错提示
    Pulling is not possible because you have unmerged files.

    报错原因

    修改的文件未提交

    这个错误其实是这样子的——其实我之前已经pull过代码了,然后出现了冲突,解决冲突之后,我想再pull一下时报的错,后来我才知道,解决掉冲突之后是需要再次commit的

    解决办法——提交到本地

    git add .嗯是的,这里 commit 前也需要先 add 一下git commit \-m "获取新的代码"git pull

    git push失败报错提示
    fatal: Could not read from remote repository.Please make sure you have the correct access rights

    报错原因

    原因一:github上没有添加最新的公钥 原因二:网络未连接

    原因一解决办法——配置公钥

    1.找到公钥打开,并复制其内容

    2.添加公钥到github

    说一下为什么会这样,因为github和gitlab是共用同一个公钥和私钥,在做公司项目的时候,我clone失败(上面第一个错误)时,重新配置了公钥和私钥,所以此时我的github上没有我最新的公钥,导致我无法push

    原因二解决办法——连接网络

    网线松动

    掉出公司内网,需要重新登录

    WiFi没网

    撤销对文件的修改描述

    修改了一个复杂的index.vue文件,修改之后觉得自己写得乱糟糟的,没有一丝头绪,但这个修改文件未提交,我想恢复到它最开始的样子。

    解决办法

    运行命令 git status获取到我们这个文件的路径

    git checkout \-- 文件完整路径(好像不加--这两个横线也能使)

    然后关闭这个文件在打开就好了 在提醒你是否保存修改切记不要保存

    这是一个非常危险的命令,执行此操作后git会用最近的commit覆盖掉整个文件。

    除非你确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令。

    自己的代码被pull下来的代码覆盖描述

    自己的代码刚刚提交,同事然后把我的代码拉下来之后也提交了,然后我再次把代码重新pull下来,发现自己刚刚写的代码全没了(备注:我合同事写的同一个文件)

    解决办法(一)

    git log找到最近一次提交的commit编码

    git reset \--hard 复制的commit编码然后关闭这个文件在打开就好了 在提醒你是否保存修改切记不要保存

    解决办法(二)

    ctrl + z使用这个办法是必须要知道,自己改动过哪些文件,并且编辑器未被关闭过(我当时编辑器刚好卡了,然后重启了一下编辑器.....)

    只想拉取远端代码 不想commit描述

    自己的代码只写了一丁点,旁边的同事说他提交了,叫我pull一下,因为没写什么东西,所以不想commit

    异想天开的尝试

    当时我就想,可不可以直接pull,结果当然是不行啦,git会给你报如下的错误

    our local changes to the following files would be overwritten by merge:

    解决办法

    git stash暂存自己的打码

    git pull拉取代码

    git stash pop弹出暂存

    想要回到pull之前的状态问题描述

    commit之后,把代码pull下来,出现很多冲突,然后想回到pull之前的状态,将代码格式化之后再pull

    解决办法

    git merge \--abort回到冲突之前的状态

    git merge --abort将会抛弃合并过程并且尝试重建合并前的状态。但是,当合并开始时如果存在未commit的文件,git merge --abort在某些情况下将无法重现合并前的状态。(特别是这些未commit的文件在合并的过程中将会被修改时)

    查看自己的commit记录描述

    公司要求写日志,想通过查看一下自己的commit记录来写日志,

    解决办法

    git log此方法有缺陷,只能展示最近一次push时的commit记录 最后,只有在GitLab上的历史看了

    最后

    不建议大家使用Git的第三方可视化工具,首先有的笔试或者面试是要考查Git的,其次感觉使用git可视化工具之后,就没有那味儿了。

    (完)

    微软于年初推出了自己的Python教程,我们将其汉化提供给大家,欢迎大家收藏关注哦~(已经汉化完成的20集,我们日更1集,未完成部分我们尽快更新)

    一、基本git命令总结

    是时候该总结一下有关 Git 命令的总结了,因为长时间都是独自开发,所以使用的命令蛮有限的,但是开心的是:中途也教过若干好友 git 与 github 的使用,写下这篇为更多将来的人儿。

    前提:安装了 git

    这里需要使用vim编辑,推荐自己的 vim使用

    二、Git工作流程和常用命令分享

    git是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。林纳斯·托瓦兹在编写第一个版本时就使用了“git”这个名称, 他将工具描述为“愚蠢的内容跟踪器”。

    [图片上传失败...(image-c23291-1619063471664)]

    四个专有名词:

    Workspace:工作区

    Index / Stage:暂存区

    Repository:仓库区(或本地仓库)

    Remote:远程仓库

    打开本地生成的.git隐藏文件

    创建新项目gittest

    创建新文件test.txt

    git add

    git status显示有变更的文件

    git restore 撤回文件修改内容

    git commit –m “注释”

    修改内容-> 执行git diff工作区和本地仓库的差异

    git log显示当前分支的版本历史

    git reset --hard HEAD^ 当前版本回退到上一个版本

    git reset --hard HEAD^ ^ 当前版本回退到上上一个版本

    git reset --hard HEAD~100 回退到前100个版本

    恢复已经删除的版本

    git reflog 展示所有的提交记录

    git reset --hard 回退到指定版本

    git push origin master 将本地master分支推送到远程master分支,相当于创建远程分支

    git checkout -b dev = git branch dev + git checkout dev 创建并切换分支

    git branch 不带参数,会列出所有本地的分支;带参数表示创建分支

    git branch –d name 删除本地分支(-D表示强制删除)

    git branch –r 不带参数,会列出所有远程的分支

    git branch --set-upstream-to=origin/ 本地和远程分支关联

    git push origin –delete 删除远程分支

    git merge release用于合并指定分支到当前分支上

    注:Fast-forward表示的合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。在这种模式下,删除分支后,会丢掉分支日志信息。可以使用带参数 --no-ff来禁用”Fast forward”模式。

    git merge --no-ff -m “注释”dev

    git checkout release 切换release分支

    vim test.txt 修改某条内容

    git commit test.txt -m “release修改某条内容”

    git checkout master 切换master分支

    vim test.txt 修改某条同release内容

    git commit test.txt -m “master修改某条内容”

    git merge release 显示冲突

    git status 显示冲突提示

    Git用标记出不同分支的内容,其中>>>>release 是指release上修改的内容
    vim test.txt 修改内容

    git add test.txt

    git commit -a -m “fix conflict”

    当前分支有没有提交但也不合适现在就提交的内容,Git提供了暂储功能stash

    git checkout release

    vim test.txt 修改test.txt内容

    git checkout develop 此时会提示Aborting

    git status 查看当前状态

    Git stash list 查看所有暂储列表

    git stash apply恢复,恢复后stash内容并不删除,你需要使用命令git stash drop来删除;
    另一种方式是使用git stash pop,恢复的同时把stash内容也删除了

    创建Git Tag并推送远程服务器

    git tag -a V1.0.0 –m“注释” //创建TAG

    git push origin V1.0.0 //推送到远程服务器

    git push origin --tag //提交所有tag至服务器

    git tag -d V1.0.0 //删除本地标签

    git push origin --delete tag //删除远程标签

    HEAD,它始终指向当前所处分支的最新的提交点。你所处的分支变化了,或者产生了新的提交点,HEAD就会跟着改变

    add相关命令很简单,主要实现将工作区修改的内容提交到暂存区,交由git管理。

    git add .添加当前目录的所有文件到暂存区

    git add 添加指定目录到暂存区,包括子目录

    git add 添加指定文件到暂存区

    commit相关命令也很简单,主要实现将暂存区的内容提交到本地仓库,并使得当前分支的HEAD向后移动一个提交点。

    git commit -m 提交暂存区到本地仓库,message代表说明信息

    git commit --amend -m 使用一次新的commit,替代上一次提交

    上传本地仓库分支到远程仓库分支,实现同步。

    git push 上传本地指定分支到远程仓库

    git push --force强行推送当前分支到远程仓库,即使有冲突

    git push --all推送所有分支到远程仓库

    关于分支,大概有展示分支,切换分支,创建分支,删除分支这四种操作。

    git branch列出所有本地分支

    git branch -r列出所有远程分支

    git branch -a列出所有本地分支和远程分支

    git branch 新建一个分支,但依然停留在当前分支

    git checkout -b 新建一个分支,并切换到该分支

    git checkout 切换到指定分支,并更新工作区

    git branch -d 删除分支

    git push origin --delete 删除远程分支

    关于分支的操作虽然比较多,但都比较简单好记

    merge命令把不同的分支合并起来。在实际开放中,我们可能从master分支中切出一个分支,然后进行开发完成需求,中间经过R3,R4,R5的commit记录,最后开发完成需要合入master中,这便用到了merge。

    git merge 合并指定分支到当前分支

    注:如果在merge之后,出现conflict,主要是因为两个用户修改了同一文件的同一块区域。需要针对冲突情况,手动解除冲突。

    rebase又称为衍合,是合并的另外一种选择。

    在开始阶段,我们处于new分支上,执行git rebase dev,那么new分支上新的commit都在dev分支上重演一遍,最后checkout切换回到new分支。这一点与merge是一样的,合并前后所处的分支并没有改变。

    git rebase dev,通俗的解释就是new分支想站在dev的肩膀上继续下去。

    rebase操作不会生成新的节点,是将两个分支融合成一个线性的提交。

    rebase也需要手动解决冲突。

    1.如果你想要一个干净的,没有merge commit的线性历史树,那么你应该选择git rebase

    2.如果你想保留完整的历史记录,并且想要避免重写commit history的风险,你应该选择使用git merge

    reset命令把当前分支指向另一个位置,并且相应的变动工作区和暂存区。

    git reset —soft 只改变提交点,暂存区和工作目录的内容都不改变

    git reset —mixed 改变提交点,同时改变暂存区的内容

    git reset —hard 暂存区、工作区的内容都会被修改到与提交点完全一致的状态

    git revert用一个新提交来消除一个历史提交所做的任何修改。

    在回滚这一操作上看,效果差不多。git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。

    在 Git工作区的根目录创建一个特殊的.gitignore文件。

    在.gitignore文件中,添加需要忽略的文件。

    git rm -r --cached . //将仓库中的index递归删除

    git add . //重新添加仓库索引

    git commit -m “update git.ignore” //提交

    git branch --set-upstream-to=origin/ //重现将本地仓库和远程仓库关联

    最后,如果此篇博文对你有所帮助,别忘了点个赞哟~

    三、Git 经典操作场景,专治不会合代码

    git 对于大家应该都不太陌生,熟练使用git已经成为程序员的一项基本技能,尽管在工作中有诸如 Sourcetree 这样牛X的客户端工具,使得合并代码变的很方便。但找工作面试和一些需彰显个人实力的场景,仍然需要我们掌握足够多的git命令。

    下边我们整理了45个日常用git合代码的经典操作场景,基本覆盖了工作中的需求。

    如果你用 git commit -a 提交了一次变化(changes),而你又不确定到底这次提交了哪些内容。你就可以用下面的命令显示当前 HEAD 上的最近一次的提交(commit):

    或者

    如果你的提交信息(commit message)写错了且这次提交(commit)还没有推(push), 你可以通过下面的方法来修改提交信息(commit message):

    这会打开你的默认编辑器, 在这里你可以编辑信息. 另一方面, 你也可以用一条命令一次完成:

    如果你已经推(push)了这次提交(commit), 你可以修改这次提交(commit)然后强推(force push), 但是不推荐这么做。

    如果这只是单个提交(commit),修改它:

    如果你需要修改所有 历史 , 参考 'git filter-branch'的指南页.

    通过下面的方法,从一个提交(commit)里移除一个文件:

    这将非常有用,当你有一个开放的补丁(open patch),你往上面提交了一个不必要的文件,你需要强推(force push)去更新这个远程补丁。

    如果你需要删除推了的提交(pushed commits),你可以使用下面的方法。可是,这会不可逆的改变你的 历史 ,也会搞乱那些已经从该仓库拉取(pulled)了的人的 历史 。简而言之,如果你不是很确定,千万不要这么做。

    如果你还没有推到远程, 把Git重置(reset)到你最后一次提交前的状态就可以了(同时保存暂存的变化):

    这只能在没有推送之前有用. 如果你已经推了, 唯一安全能做的是 git revert SHAofBadCommit , 那会创建一个新的提交(commit)用于撤消前一个提交的所有变化(changes);或者, 如果你推的这个分支是rebase-safe的 (例如:其它开发者不会从这个分支拉), 只需要使用 git push -f 。

    同样的警告:不到万不得已的时候不要这么做.

    或者做一个 交互式rebase 删除那些你想要删除的提交(commit)里所对应的行。

    注意, rebasing(见下面)和修正(amending)会用一个 新的提交(commit)代替旧的 , 所以如果之前你已经往远程仓库上推过一次修正前的提交(commit),那你现在就必须强推(force push) ( -f )。注意 – 总是 确保你指明一个分支!

    一般来说, 要避免强推 . 最好是创建和推(push)一个新的提交(commit),而不是强推一个修正后的提交。后者会使那些与该分支或该分支的子分支工作的开发者,在源 历史 中产生冲突。

    如果你意外的做了 git reset --hard , 你通常能找回你的提交(commit), 因为Git对每件事都会有日志,且都会保存几天。

    你将会看到一个你过去提交(commit)的列表, 和一个重置的提交。选择你想要回到的提交(commit)的SHA,再重置一次:

    这样就完成了。

    一般来说, 如果你想暂存一个文件的一部分, 你可这样做:

    -p 简写。这会打开交互模式, 你将能够用 s 选项来分隔提交(commit);然而, 如果这个文件是新的, 会没有这个选择, 添加一个新文件时, 这样做:

    然后, 你需要用 e 选项来手动选择需要添加的行,执行 git diff --cached 将会显示哪些行暂存了哪些行只是保存在本地了。

    git add 会把整个文件加入到一个提交. git add -p 允许交互式的选择你想要提交的部分.

    多数情况下,你应该将所有的内容变为未暂存,然后再选择你想要的内容进行commit。但假定你就是想要这么做,这里你可以创建一个临时的commit来保存你已暂存的内容,然后暂存你的未暂存的内容并进行stash。然后reset最后一个commit将原本暂存的内容变为未暂存,最后stash pop回来。

    注意1: 这里使用 pop 仅仅是因为想尽可能保持幂等。注意2: 假如你不加上 --index 你会把暂存的文件标记为为存储。

    如果你只是想重置源(origin)和你本地(local)之间的一些提交(commit),你可以:

    重置某个特殊的文件, 你可以用文件名做为参数:

    如果你想丢弃工作拷贝中的一部分内容,而不是全部。

    签出(checkout)不需要的内容,保留需要的。

    另外一个方法是使用 stash , Stash所有要保留下的内容, 重置工作拷贝, 重新应用保留的部分。

    或者, stash 你不需要的部分, 然后stash drop。

    这是另外一种使用 git reflog 情况,找到在这次错误拉(pull) 之前HEAD的指向。

    重置分支到你所需的提交(desired commit):

    完成。

    先确认你没有推(push)你的内容到远程。

    git status 会显示你领先(ahead)源(origin)多少个提交:

    一种方法是:

    在main下创建一个新分支,不切换到新分支,仍在main下:

    把main分支重置到前一个提交:

    HEAD^ 是 HEAD^1 的简写,你可以通过指定要设置的 HEAD 来进一步重置。

    或者, 如果你不想使用 HEAD^ , 找到你想重置到的提交(commit)的hash( git log 能够完成), 然后重置到这个hash。使用 git push 同步内容到远程。

    例如, main分支想重置到的提交的hash为 a13b85e :

    签出(checkout)刚才新建的分支继续工作:

    假设你正在做一个原型方案(原文为working spike (see note)), 有成百的内容,每个都工作得很好。现在, 你提交到了一个分支,保存工作内容:微信搜索公众号:Java后端编程,回复:java 领取资料 。

    当你想要把它放到一个分支里 (可能是 feature , 或者 develop ), 你关心是保持整个文件的完整,你想要一个大的提交分隔成比较小。

    假设你有:

    我去可以通过把内容拿到你的分支里,来解决这个问题:

    这会把这个文件内容从分支 solution 拿到分支 develop 里来:

    然后, 正常提交。

    Note: Spike solutions are made to analyze or solve the problem. These solutions are used for estimation and discarded once everyone gets clear visualization of the problem.

    假设你有一个 main 分支, 执行 git log , 你看到你做过两次提交:

    让我们用提交hash(commit hash)标记bug ( e3851e8 for #21, 5ea5173 for #14).

    首先, 我们把 main 分支重置到正确的提交( a13b85e ):

    现在, 我们对 bug #21 创建一个新的分支:

    接着, 我们用 cherry-pick 把对bug #21的提交放入当前分支。这意味着我们将应用(apply)这个提交(commit),仅仅这一个提交(commit),直接在HEAD上面。

    这时候, 这里可能会产生冲突, 参见交互式 rebasing 章 冲突节 解决冲突.

    再者, 我们为bug #14 创建一个新的分支, 也基于 main 分支

    最后, 为 bug #14 执行 cherry-pick :

    一旦你在github 上面合并(merge)了一个pull request, 你就可以删除你fork里被合并的分支。如果你不准备继续在这个分支里工作, 删除这个分支的本地拷贝会更干净,使你不会陷入工作分支和一堆陈旧分支的混乱之中(IDEA 中玩转 Git)。

    如果你定期推送到远程, 多数情况下应该是安全的,但有些时候还是可能删除了还没有推到远程的分支。让我们先创建一个分支和一个新的文件:

    添加文件并做一次提交

    现在我们切回到主(main)分支,‘不小心的’删除 my-branch 分支

    在这时候你应该想起了 reflog , 一个升级版的日志,它存储了仓库(repo)里面所有动作的 历史 。

    正如你所见,我们有一个来自删除分支的提交hash(commit hash),接下来看看是否能恢复删除了的分支。

    看! 我们把删除的文件找回来了。Git的 reflog 在rebasing出错的时候也是同样有用的。

    删除一个远程分支:

    你也可以:

    删除一个本地分支:

    首先, 从远程拉取(fetch) 所有分支:

    假设你想要从远程的 daves 分支签出到本地的 daves

    ( --track 是 git checkout -b [branch] [remotename]/[branch] 的简写)

    这样就得到了一个 daves 分支的本地拷贝, 任何推过(pushed)的更新,远程都能看到.

    你可以合并(merge)或rebase了一个错误的分支, 或者完成不了一个进行中的rebase/merge。Git 在进行危险操作的时候会把原始的HEAD保存在一个叫ORIG_HEAD的变量里, 所以要把分支恢复到rebase/merge前的状态是很容易的。

    不幸的是,如果你想把这些变化(changes)反应到远程分支上,你就必须得强推(force push)。是因你快进(Fast forward)了提交,改变了Git 历史 , 远程分支不会接受变化(changes),除非强推(force push)。这就是许多人使用 merge 工作流, 而不是 rebasing 工作流的主要原因之一, 开发者的强推(force push)会使大的团队陷入麻烦。使用时需要注意,一种安全使用 rebase 的方法是,不要把你的变化(changes)反映到远程分支上, 而是按下面的做:

    假设你的工作分支将会做对于 main 的pull-request。一般情况下你不关心提交(commit)的时间戳,只想组合 所有 提交(commit) 到一个单独的里面, 然后重置(reset)重提交(recommit)。确保主(main)分支是最新的和你的变化都已经提交了, 然后:

    如果你想要更多的控制, 想要保留时间戳, 你需要做交互式rebase (interactive rebase):

    如果没有相对的其它分支, 你将不得不相对自己的 HEAD 进行 rebase。例如:你想组合最近的两次提交(commit), 你将相对于 HEAD~2 进行rebase, 组合最近3次提交(commit), 相对于 HEAD~3 , 等等。

    在你执行了交互式 rebase的命令(interactive rebase command)后, 你将在你的编辑器里看到类似下面的内容:

    所有以 # 开头的行都是注释, 不会影响 rebase.

    然后,你可以用任何上面命令列表的命令替换 pick , 你也可以通过删除对应的行来删除一个提交(commit)。

    例如, 如果你想 单独保留最旧(first)的提交(commit),组合所有剩下的到第二个里面 , 你就应该编辑第二个提交(commit)后面的每个提交(commit) 前的单词为 f :

    如果你想组合这些提交(commit) 并重命名这个提交(commit) , 你应该在第二个提交(commit)旁边添加一个 r ,或者更简单的用 s 替代 f :

    你可以在接下来弹出的文本提示框里重命名提交(commit)。

    如果成功了, 你应该看到类似下面的内容:

    --no-commit 执行合并(merge)但不自动提交, 给用户在做提交前检查和修改的机会。 no-ff 会为特性分支(feature branch)的存在过留下证据, 保持项目 历史 一致(更多Git资料,参见IDEA 中如何完成 Git 版本回退?)。

    有时候,在将数据推向上游之前,你有几个正在进行的工作提交(commit)。这时候不希望把已经推(push)过的组合进来,因为其他人可能已经有提交(commit)引用它们了。

    这会产生一次交互式的rebase(interactive rebase), 只会列出没有推(push)的提交(commit), 在这个列表时进行reorder/fix/squash 都是安全的。

    检查一个分支上的所有提交(commit)是否都已经合并(merge)到了其它分支, 你应该在这些分支的head(或任何 commits)之间做一次diff:

    这会告诉你在一个分支里有而另一个分支没有的所有提交(commit), 和分支之间不共享的提交(commit)的列表。另一个做法可以是:

    如果你看到的是这样:

    这意味着你rebase的分支和当前分支在同一个提交(commit)上, 或者 领先(ahead) 当前分支。你可以尝试:

    如果你不能成功的完成rebase, 你可能必须要解决冲突。

    首先执行 git status 找出哪些文件有冲突:

    在这个例子里面, README.md 有冲突。打开这个文件找到类似下面的内容:

    你需要解决新提交的代码(示例里, 从中间 == 线到 new-commit 的地方)与 HEAD 之间不一样的地方.

    有时候这些合并非常复杂,你应该使用可视化的差异编辑器(visual diff editor):

    在你解决完所有冲突和测试过后, git add 变化了的(changed)文件, 然后用 git rebase --continue 继续rebase。

    如果在解决完所有的冲突过后,得到了与提交前一样的结果, 可以执行 git rebase --skip 。

    任何时候你想结束整个rebase 过程,回来rebase前的分支状态, 你可以做:

    暂存你工作目录下的所有改动

    你可以使用 -u 来排除一些文件

    假设你只想暂存某一个文件

    假设你想暂存多个文件

    这样你可以在 list 时看到它

    首先你可以查看你的 stash 记录

    然后你可以 apply 某个 stash

    此处, 'n'是 stash 在栈中的位置,最上层的 stash 会是0

    除此之外,也可以使用时间标记(假如你能记得的话)。

    你需要手动create一个 stash commit , 然后使用 git stash store 。

    如果已经克隆了:

    如果你想恢复一个已删除标签(tag), 可以按照下面的步骤: 首先, 需要找到无法访问的标签(unreachable tag):

    记下这个标签(tag)的hash,然后用Git的 update-ref

    这时你的标签(tag)应该已经恢复了。

    如果某人在 GitHub 上给你发了一个pull request, 但是然后他删除了他自己的原始 fork, 你将没法克隆他们的提交(commit)或使用 git am 。在这种情况下, 最好手动的查看他们的提交(commit),并把它们拷贝到一个本地新分支,然后做提交。

    做完提交后, 再修改作者,参见变更作者。然后, 应用变化, 再发起一个新的pull request。

    在 OS X 和 Linux 下, 你的 Git的配置文件储存在 ~/.gitconfig 。我在 [alias] 部分添加了一些快捷别名(和一些我容易拼写错误的),如下:

    你可能有一个仓库需要授权,这时你可以缓存用户名和密码,而不用每次推/拉(push/pull)的时候都输入,Credential helper能帮你。

    你把事情搞砸了:你 重置(reset) 了一些东西, 或者你合并了错误的分支, 亦或你强推了后找不到你自己的提交(commit)了。有些时候, 你一直都做得很好, 但你想回到以前的某个状态。

    这就是 git reflog 的目的, reflog 记录对分支顶端(the tip of a branch)的任何改变, 即使那个顶端没有被任何分支或标签引用。基本上, 每次HEAD的改变, 一条新的记录就会增加到 reflog 。遗憾的是,这只对本地分支起作用,且它只跟踪动作 (例如,不会跟踪一个没有被记录的文件的任何改变)。

    上面的reflog展示了从main分支签出(checkout)到2.2 分支,然后再签回。那里,还有一个硬重置(hard reset)到一个较旧的提交。最新的动作出现在最上面以 HEAD@{0} 标识.

    如果事实证明你不小心回移(move back)了提交(commit), reflog 会包含你不小心回移前main上指向的提交(0254ea7)。

    然后使用git reset就可以把main改回到之前的commit,这提供了一个在 历史 被意外更改情况下的安全网。

    关于possible的问题,通过《Git工作流程和常用命令分享》、《Git 经典操作场景,专治不会合代码》等文章的解答希望已经帮助到您了!如您想了解更多关于possible的相关信息,请到本站进行查找!

    爱资源吧版权声明:以上文中内容来自网络,如有侵权请联系删除,谢谢。

    possible
    命令下配置ip地址 浅谈issue、question和problem的区别