jjzjj

git总结

@海~涛 2023-12-02 原文


工作区:就是电脑里本地能看到的目录,它持有实际文件。
缓存区/暂存区:英文名叫 stage 或 index。在执行git add命令之后,会把工作区的修改记录添加到缓存区以便跟踪。它像个缓存区域,临时保存你的改动。
说明:缓存区的文件一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区也叫作索引(index)。
版本库/本地仓:英文名Repository,管理代码版本的地方,在执行git commit命令之后,会把缓存区的修改记录提交到版本库里。
说明:在一个空文件下,执行git init命令之后,会在该文件下创建一个版本库(.git),它是一个隐藏的目录。

一、放弃本地修改

1、没有git add 的

$ git checkout – <某文件>… #在工作区,撤销对某文件的修改
如果是放弃所有文件里的修改,直接使用git checkout .
说明:此命令只针对已经修改的内容和已经删除的文件,但不会删除刚新建的文件,因为刚新建的文件还没有加入到git的管理系统中。所以对于git来说,刚新建的文件是未知的。自己动手删除即可。

2、已经git add的

情况说明:已经修改的文件已经add到暂存区/缓存中了,但是没有commit,此时如果不想提交这个文件的修改。
$ git reset HEAD <某文件> #用版本库内容清空暂存区
如果是放弃所有修改,直接使用get reset HEAD .

3、已经git commit的

  1. 提交的文字说明写的不合适,需要修改时可如下操作。
    保留已经提交源码,只是将git commit和index信息回退到某个版本,push入远端库之前提交的commit信息还在。
    $ git reset --soft <commit_id>
  2. 提交的文字说明没问题,但index信息需要回退到某个版本,需要修改时可如下操作。
    $ git reset --mixed <commit_id>
  3. 本地仓的源码,文字说明和index,全部回退到某个版本,相当于清空某个版本以后的提交记录。
    $ git reset --hard <commit_id>
    上面时按照commit_id回退的,也可以按照提交次数回退,如下:
    $ git reset --hard HEAD^^或者gitreset --hard HEAD~2 #回退2次

4、放弃本地修改,全部与远程仓同步,强制覆盖。

1) $ git fetch --all #拉去所有的更新,不同步;
2) $ git reset --hard origin/master #本地代码同步远程最新版本(会覆盖本地所有与远程仓库上同名的文件),git reset指令把HEAD指向master最新版本。
3) $ git pull #再次更新,其实也可以不用执行这一步,因为第2步命令已经保证了与远程仓相同。
简化命令:$ git fetch --all && git reset --hard origin/master && git pull

二、分支切换

1、游离状态

从正常切换到游离状态
$ git branch -a
从游离状态切换到正常
$ git checkout <某分支名称>

三、合并分支

1、将一个A分支的提交合并到另一个B分支。

1)获取A分支上需要合并的那一笔commit-id
$ git log #找到需要合并的id
2、切换到B分支
$ git checkout <B分支名称>
3、将A分支上的提交合并到B分支
$ git cherry-pick

2、合并时发生冲突

1) 手动解决冲突
2) 将修改的文件重新加入暂存区
$ git add .
3)继续合并:$ git cherry-pick --continue
放弃合并:$ git cherry-pick --abort
退出合并:$ git cherry-pick --quit

三、修改本地仓关联的远程仓

1、查看当前远程仓
$ git remote -v
2、方式一:直接修改
$ git remote set-url origin xxxxx.git
方式二:先删后加
$ git remote rm origin
$ git remote add origin xxxxx.git

checkout用法
  1. git checkout
    #显示工作区相对于版本库修改过的文件。git checkout和git status的区别是git checkout没有显示未跟踪文件(Untracked files:),而git status则显示未跟踪的文件。
  2. git checkout 分支名
    #表示切换分支
  3. git checkout -b 新分支名
    #表示以当前分支的当前状态来创建新分支并切换到新分支 -b 表示创建新分支
  4. git checkout -b 分支名 commitID
    #表示以当前分支的commitID提交节点创建新的分支并切换到新分支。此时工作区的内容和切换分之前commitID提交节点的内容一样。
  5. git checkout .
    #表示将工作区的所有文件的内容恢复到暂存区的状态。这里暂存区的状态是指暂存区原来的状态,也就是现在要扔掉没有加入到缓存区的所有文件
  6. git checkout filename
    #表示将工作区的指定文件的内容恢复到暂存区的状态。这里暂存区的状态是指暂存区原来的状态,也就是现在要扔掉没有加入到缓存区的指定文件
  7. git checkout commitID filename
    #表示将工作区和暂存区的指定文件都恢复到指定版本的状态,此时的HEAD指针不变。即就是把工作区的指定文件(filename)修改到指定版本后(也就是扔掉后),再把当前状态的该文件(这里指commitID版本的修改)添加到暂存区,这也就是执行此命令后,就可以直接执行git commit而不需要先执行git add。相当于版本回退吗?
  8. git checkout commitID
    #表示以指定的提交节点commitID创建了一个临时性分支,此临时性分支可用于做实验性修改。注意:此时HEAD不位于任何分支上,处于游离状态。更准确的说,此命令是以指定的提交节点创建了一个临时分支,一个临时的HEAD指向了这个临时分支,可以在这个临时分支上修改内容并且提交内容。但从临时分支切换到原有分支或其他分支,这个临时分支就会消失,并且在临时分支上的实验性修改也会消失,不影响原有分支。
    实际用例:(1)在游离状态的分支下,实验修改后不再需要修改记录,即扔掉实验代码,使用切换分支命令(git checkout 分支名),即可结束游离状态
    (2)在游离状态的分支下,实验修改后需要在原有分支上保留这些修改记录,可以用临时分支(游离状态)的当前状态创建一个新分支(git checkout -b 新分支名),再把这个新分支上的修改合并到原有分支上即可。

有关git总结的更多相关文章

  1. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  2. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  3. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

  4. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

  5. ruby - 让 bundler 使用 http : instead of git:? - 2

    我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://

  6. ruby-on-rails - 安装 active admin 时 activeadmin.git (at master) is not yet checked out 错误 - 2

    Activeadmingem已添加到我的rails项目中,但每次我尝试安装railsgactive_admin:install时,我都会收到类似的错误git://github.com/activeadmin/activeadmin.git(atmaster)isnotyetcheckedout.Runbundleinstallfirst.我肯定在运行“railsgactive_admin:install”之前运行了bundle。运行“bundleshow”后,我看到我已将“*activeadmin(1.0.0.pre3f916d6)”添加到我的项目中,但不断收到此错误消息。我的gem文

  7. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  8. ruby - git:从 bitbucket 导出并导入 github(带提交) - 2

    我在bitbucket上创建了一个私有(private)git存储库并提交了代码。现在我想导出所有(提交、代码、历史记录)并将其导入github上的gitrepo。有没有办法做到这一点?谢谢 最佳答案 在本地检查所有内容到您的计算机和gitpull。创建一个github存储库将此存储库添加为您的第二个远程(“使用gitremote添加githubURL”)推送到第二个Remote 关于ruby-git:从bitbucket导出并导入github(带提交),我们在StackOverflow

  9. Unity 报错No ‘git‘ executable was found. Please install Git on your system then restart - 2

    亲测可用。Anerroroccurredwhileresolvingpackages:Projecthasinvaliddependencies: com.unity.xxx:No'git'executablewasfound.PleaseinstallGitonyour  systemthenrestartUnityandUnityHub在我们使用PackageManager时,Unity允许我们使用Git上的package(点击加号,选择addpackagefromgitURL,或者是直接在Asset/Packages/manifest.json中添加包名)。但是这种操作需要我们事先装好g

  10. ruby - RSpec Git Bash Windows——缺少颜色? - 2

    我在Windows上使用GitBash来完成我的大部分Rails工作,每次我运行bundleexecrspecspec它都会提醒我“你必须geminstallwin32console才能使用Windows上的颜色”,然后以纯黑色和白色运行RSpec。但是我确实安装了win32console,当我在列表中运行gemlist时,它有win32console(1.3.0x86-mingw32)。RSpec工作正常,但我希望它有一些颜色。我用谷歌搜索了这个并找到了多种解决方案,但似乎没有一个适合我。有人可以写出在GitBashforWindows上使用RSpec获取颜色的“循序渐进”方法吗?

随机推荐