热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

你应该掌握的Git常用操作

获取与创建项目创建仓库的途径有:在本地已有的目录,初始化一个新的;克隆复制一份别人的项目。gitinit在当前目录下创建.git目录,同时当前目录成为一个Git仓库。gitclon
获取与创建项目
  • 创建仓库的途径有:
    1. 在本地已有的目录,初始化一个新的;
    2. 克隆复制一份别人的项目。

git init

  • 在当前目录下创建.git目录,同时当前目录成为一个Git仓库。

git clone

  • git clone Git仓库url:将http或ssh链接指向的Git仓库拷贝到本地。
  • git clone Git仓库url 本地目录路径:将远程Git仓库拷贝到本地指定目录。
添加与提交

基本流程

  1. 使用git add添加需要追踪的新文件和待提交的更改;
  2. 使用git statusgit diff查看有何改动;
  3. 使用git commit提交快照。

git add

  • git add 文件:将文件添加到缓存区,该文件被标记为被追踪。
  • git add .:缓存当前目录下所有文件,不包括已删除的文件。
  • 注意,git add只是复制一份当前状态下的该文件到缓存区,该文件之后的修改若不重新git add,则提交的时候,只会将上次git add的缓存提交给仓库。

git commit

  • 将缓存写入仓库中。

  • git add工作区->缓存区git commit缓存区->仓库

  • git commit -m "本次提交说明":一次性将缓存区所有文件修改提交到仓库的当前分支。

  • git commit -am "本次提交说明":自动把所有已经跟踪过的文件缓存,并提交到仓库。常用于跳过git add步骤快速提交。

  • git commit --amend "本次提交说明":重新提交。此次提交代替上一次提交的结果。尤其适用于提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了的情况。

git status

  • git status:显示当前仓库的最新状态。

  • git status -s:当前仓库的最新状态的简介。

    《你应该掌握的Git常用操作》 git status -s

    • 状态值第一栏是关于缓存区的(绿色),第二栏是关于工作区的(红色)。
      • ??表示该文件仅是本地文件。
      • 绿色A表示该文件以前没被提交过,添加到缓存;(提交时会告知仓库添加此快照)。
      • 绿色M表示该文件以前被提交过后,又添加到缓存;(提交时会告知仓库修改此快照)。
      • 绿色D表示该文件以前被提交过后,被本地删除了,又删除缓存;(提交时会告知仓库删除此快照)。
      • 绿色R表示该文件添加到快照时,系统发现某个D快照与其相同,并将D文件名改为该文件名。
      • 红色M表示该文件被本地修改过。
      • 红色D表示该文件被本地删除了。

git diff

  • git diff:比较工作区和缓存区的不同。
  • git diff --cached:比较缓存区和仓库的不同。
  • git diff 文件:比较指定文件在工作区和缓存区的不同。
  • git diff 文件 --cached:比较指定文件在缓存区和仓库的不同。
  • git diff 提交版本号1 提交版本号2:比较两次提交之间的区别。
  • git diff 分支1 分支2:比较两个分支之间的区别。
  • 注意:只会比较那些跟踪文件(即git add过的文件)。

git show

  • git show:查看最后一个提交的内容。
  • git show HEAD~1:查看倒数第二个提交的内容。
  • git show 提交版本号:查看指定提交的内容。
删除与恢复

git rm

  • 主要用于从版本库中删除文件。

  • git rm 文件:把文件从版本库中删除,不再跟踪。

  • git rm log/\*.log:将log目录下扩展名为.log的所有文件从版本库中删除,不再跟踪。通常适用于不小心把一些编译、日志、debug文件错误提交到版本库。

  • git rm -f 文件:当文件有未提交的缓存区修改时,直接使用git rm 文件会报错。此时执行此命令可强制将文件从缓存区和版本库中删除。
  • git rm --cached 文件:把文件从版本库中删除,但让文件保留在工作区且不被Git继续跟踪。通常适用于rm文件之后把其添加到.gitignore中。

恢复

  • git checkout -- 文件:丢弃工作区的修改。此文件必须是Git跟踪的。
    1. 修改后仍未放到缓存区,恢复到上一次git commit的状态。
    2. 添加到缓存区后又做了修改,恢复到上一次git add的状态。
  • git reset HEAD 文件:丢弃缓存区的修改,回退到工作区。
  • git reset --hard:重置所有文件到上次commit的状态。
  • git reset --hard HEAD~1:将当前分支重置为倒数第2个版本。
  • git reset --hard 提交版本号:将当前分支重置为指定版本。
版本控制

版本号

  • Git的版本号是SHA1校验和,而不是用递增的1、2、3……,因为分布式的版本控制系统要确保每个用户的修改记录都是唯一的,不会发生版本号冲突的情况。

  • HEAD表示当前版本,HEAD^表示上一个版本,HEAD~100表示往上100个版本。

git log

  • git log:显示从最近到最远的提交日志。包含每个提交的SHA1校验和、作者的名字和邮箱、提交时间以及提交说明等。
  • git log --onelinegit log的简要版
  • git log --decorate:不仅输出git log的信息,还带标签等额外信息。
  • git log --graph 不仅输出git log的信息,还可查看当前分支什么时候出现了分支、合并。
  • git log 分支名:查看指定分支的提交日志。
  • git log 要查看的分支名branchA ^要忽略的分支名branchB:查看branchA的日志信息(排除branchB的信息)

git reflog

  • 记录每一次的版本改动。包括commit记录、reset版本退回记录。

git tag

  • git tag:查看所有标签。注意:标签不是按时间列出,而是按字母排序。
  • git show :查看指定标签的信息。
  • git tag :在指定版本号上打上标签。
  • git checkout :切换到指定标签。
  • git push --tags:将标签推送给远程仓库。
远程项目

git remote

  • git remote add :添加并关联一个远程库。shortname一般为origin。
    1. 以http方式添加

      git remote add origin https://github.com/daking1991/GitTest.git

    2. 以ssh方式添加

      git remote add origin git@github.com:daking1991/GitTest.git

  • git remote:查看已配置的远程仓库,列出各远程仓库的shortname。

  • git remote -v:查看已配置的远程仓库的读写url。

    // git remote -v
    origin git@github.com:daking1991/GitTest.git (fetch)
    origin git@github.com:daking1991/GitTest.git (push)

  • git remote show :查看shortname对应的远程仓库的fetch和push等详细信息。

    * remote origin
    Fetch URL: git@github.com:daking1991/GitTest.git
    Push URL: git@github.com:daking1991/GitTest.git
    HEAD branch: (unknown)

  • git remote rm :移除指定的远程仓库。
  • git remote rename :重命名一个远程仓库的shortname。

git push

  • git push :将本地分支推送到远程仓库。

拉取

  • git pull :拉取远程仓库最新提交,并合并到指定的本地分支上。

  • git fetch:拉取远程仓库最新提交,但不会自动合并分支。

分支

git branch

  • git branch:列出本地分支列表。当前分支前会标有*号
  • git branch -r:列出远程分支列表。
  • git branch -a:列出所有分支列表。
  • git branch 分支:创建新分支。
  • git branch -d 分支:删除指定分支。
  • git branch -v -a:查看所有分支的最后一次提交。

git checkout

  • git checkout 分支:切换到指定分支。
  • git checkout -b 分支:创建并切换到指定分支。

git merge

  • git merge 分支:将指定分支合并到当前分支上。

合并冲突

  • 不同分支修改了相同区块的代码时,合并分支时git会将此部分标记为冲突,需要用户手动去修改。

    《你应该掌握的Git常用操作》 冲突文件内容

  • 可用git diff查看冲突详情

    《你应该掌握的Git常用操作》 冲突详情

  • 可用git status -s查看冲突文件,状态标识为UU

    《你应该掌握的Git常用操作》 冲突文件

  • 手动修改后,使用git add重新写入缓存区。

子模块
  • 一个大型工程拆分为一些子工程。既有利于降低工程开发难度,也有利于使用现成的方案或第三方方案作为子工程。

添加子模块

  • 步骤

    1. 在某工程的根目录下,执行

      git submodule add git@git.oschina.net:daking/android-client-common.git

    2. 会多出一个.gitmodules文件,此为子模块配置文件,其内容为

      [submodule "android-client-common"]
      path = android-client-common
      url = git@git.oschina.net:daking/android-client-common.git
      # 若有多个子模块,则会有多个条目...

  • 指定submodule在父工程中的位置

    git submodule add git@git.oschina.net:daking/android-client-jni.git ./app/src/main/jni/api

  • 指定submodule要跟踪的分支

    • submodule add添加的子模块默认是处于游离状态的,并不处于任何分支上。

    • 可指定其要跟踪的分支:

      1. git submodule add git仓库路径 -b 要跟踪的分支名
      2. 或直接在.gitmodules配置文件中对应子模块下增加branch = 要跟踪的分支名

clone一个带子模块的Git仓库

  1. 方案1
    1. git clone Git仓库路径
    2. 初始化以及更新子模块:git submodule initgit submodule update
  2. 方案2
    git clone --recursive Git仓库路径 参数–recursive会递归初始化并更新每个子模块。

更新子模块

  1. 先更新子模块,git submodule update。若嵌套多层子模块,则git submodule foreach "git submodule update"
  2. 再更新主仓库。

子模块的修改提交

  1. 在子模块的根目录下,切换到要修改的分支,再进行代码修改。这是因为submodule的HEAD默认是处于游离状态,它并没在任何分支上。
  2. 在子模块的根目录进行Git提交。
  3. 在主Git仓库的根目录进行Git提交。

删除子模块

  1. 删除子模块的Git缓存,git rm --cached android-client-common/

  2. 删除子模块的本地文件,rm -rf android-client-common/

  3. 删除与此子模块相关的配置

    rm -rf .git/modules/android-client-common/
    .gitmodules中的相关配置
    .git/config中的相关配置

  4. 修改提交

    git add .gitmodules
    git commit -m 'remove submodule: android-client-common'
    git push

git config
  • git config --list:列出所有配置信息。
  • git config :检查关键字key的配置。如git config user.name,查看姓名配置。
  • git config --global alias.命令别名 命令:为指定命令配置一个别名,可快速输入命令。
    1. git config --global alias.unadd 'reset HEAD':使用git unadd 文件可丢弃指定文件在缓存区的修改。

    2. git config --global alias.st status:使用git st代替git status

    3. git config --global alias.co checkout:使用git co代替git checkout

    4. git config --global alias.cm commit:使用git cm代替git commit

    5. git config --global alias.br branch:使用git br代替git branch

    6. 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 lg输出高逼格的日志信息。

      《你应该掌握的Git常用操作》 git lg输出高逼格的日志

    7. git config --global alias.last 'log -1':使用git last显示最近一次的提交。

      《你应该掌握的Git常用操作》 git last查看最近一条日志

  • git config --global user.name "yourname"git config --global user.email "youremail":修改姓名和邮箱,去掉--global可针对每个repo单独设定。

我的博客


推荐阅读
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
  • 本文将详细介绍如何在Android Studio中导入和编译OSChina Android 2.4版本的源码。包括所需软件、下载地址以及一些注意事项。 ... [详细]
  • 从零开始编译Linux系统:第16章 全新起点
    本章将详细介绍如何从零开始编译一套完整的Linux系统,涵盖关键组件如glibc库的介绍及其重要性。通过本文,读者将了解从源代码构建Linux系统的全过程。 ... [详细]
  • 四、作为您的 VCS 的 GitHub ... [详细]
  • SvpplyTable: 实现可扩展和可折叠的菜单动画
    SvpplyTable 是一个示例项目,旨在实现类似 Svpply 应用程序中的可扩展和可折叠的菜单动画效果。该项目托管在 GitHub 上,地址为 https://github.com/liuminqian/SvpplyTable。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 探讨异步 Rust 中多线程代码无法实现并行化的原因及解决方案。 ... [详细]
  • Git命令基础应用指南
    本指南详细介绍了Git命令的基础应用,包括如何使用`git clone`从远程服务器克隆仓库(例如:`git clone [url/path/repository]`)以及如何克隆本地仓库(例如:`git clone [local/path/repository]`)。此外,还提供了常见的Git操作技巧,帮助开发者高效管理代码版本。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文详细介绍了在 Android 7.1 系统中调整屏幕分辨率和默认音量设置的方法。针对系统默认音量过大的问题,提供了具体的步骤来降低系统、铃声、媒体和闹钟的默认音量,以提升用户体验。此外,还涵盖了如何通过系统设置或使用第三方工具来优化屏幕分辨率,确保设备显示效果更加清晰和流畅。 ... [详细]
  • 使用 `git stash` 可以将当前未提交的修改保存到一个临时存储区,以便在后续恢复工作目录时使用。例如,在处理中间状态时,可以通过 `git stash` 命令将当前的所有未提交更改推送到一个新的储藏中,从而保持工作目录的整洁。此外,本文还将详细介绍如何解决 `git stash pop` 时可能出现的冲突问题,帮助用户高效地管理代码变更。 ... [详细]
  • 在订单服务启动过程中,首先会从Eureka服务器中查找已注册的配置中心,随后从Gitee配置仓库中获取特定的 `order-test.yml` 文件,以确保服务能够正确加载所需的配置信息。这一流程保证了配置管理的灵活性和可维护性。 ... [详细]
  • Android 网络请求中的下载断点续传技术解析与实现
    本文详细解析了 Android 平台下网络请求中下载断点续传的技术原理与实现方法。断点续传技术在下载过程中尤为重要,当下载因网络中断或其他原因暂停时,该技术允许从上次中断的位置继续下载,而无需重新开始。文章重点介绍了断点续传的逻辑思路和关键实现步骤,包括如何记录下载进度、处理 HTTP 请求头以及优化下载性能。通过具体示例代码,读者可以更好地理解和应用这一技术,提高应用程序的用户体验和可靠性。 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 在 CentOS 7 上部署和配置 RabbitMQ 消息队列系统时,首先需要安装 Erlang,因为 RabbitMQ 是基于 Erlang 语言开发的。具体步骤包括:安装必要的依赖项,下载 Erlang 源码包(可能需要一些时间,请耐心等待),解压源码包,解决可能出现的错误,验证安装是否成功,并将 Erlang 添加到环境变量中。接下来,下载 RabbitMQ 的 tar.xz 压缩包,并进行解压和安装。确保每一步都按顺序执行,以保证系统的稳定性和可靠性。 ... [详细]
author-avatar
mobiledu2502856963
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有