type
date
status
slug
summary
tags
category
password
icon
😀
这里写文章的前言: 一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。

git的本质

git本质就是一个仓库,其管理了各个版本的所有控制文件的一个快照,如果当前版本文件相对于前一个版本未修改,则保存前一个版本的指针;否则,则保存一份新的数据。

工作目录中文件的两种状态

  • 已被git追踪:指已经被纳入到版本控制系统中的文件,与git中的快照流产生联系;
  • 未被git追踪:未被纳入版本控制系统中的文件;
  • 未追踪→追踪:先将更改的文件保存到暂存区进行标记,使之纳入下一版本的快照流中(此时快照已在仓库中创建),再将所有的更改一并提交到仓库中;基本所有的操作都是对暂存区的操作;

git文件的三种状态

  • 未修改;
  • 已修改;
  • 已暂存:在进行提交之前,需要将已被修改的文件选择性的添加到暂存区中进行标记从而产生快照,以将之添加到下一版本当中;

暂存区

暂存区是工作目录与git仓库之间的一块缓存任何对已追踪文件的改变都要先添加到暂存区,才能提交到仓库形成下一个版本;
以删除文件为例,如果直接使用rm删除工作目录中的文件,则会需要先将此次改动添加到暂存区,再提交到仓库中,使得新版本不会继续追踪该文件;

常用git操作

  • git add:将文件添加到暂存区;
  • git status:查看工作目录中的文件状态;
  • git diff:
    • git diff:比较工作目录中当前文件和暂存区域快照之间的差异,即修改之后还未暂存的变化;
    • git diff --staged/--cached:比较已暂存文件与最后一次提交的文件差异;
  • git commit:向仓库提交更新,即将暂存区中的快照添加到该版本中;
  • git rm:从git中移除某个文件,即对暂存区进行操作;
  • git mv:移动文件或文件重命名;
  • git log:
    • git log:默认按时间顺序打印所有commit记录,给出哈希值、作者名字、电子邮箱、提交时间以及提交文档;
    • --patch/-p:显示每次提交所引入的差异;
    • -number:限制显示的提交数目;
    • --stat:显示一些统计信息;
    • --pretty[=opt]:使用不同于默认格式的方式展示提交历史;
      • --pretty=online:将每一个提交记录都是用一行来表示;
      • --graph:在日志旁以ASCII图形显示分支与合并历史;

git撤销操作

commit之后需要微小调整

运行git commit --amend
若暂存区有文件,则将暂存区与上次提交合并成一个新的commit并替代上次提交;

取消暂存

  • git restore —staged <file>;
  • git reset HEAD <file>;(危险)

撤销文件修改

  • git checkout -- <file> ...危险);

注意点

记住,在 Git 中任何 已提交 的东西几乎总是可以恢复的。 甚至那些被删除的分支中的提交或使用 --amend 选项覆盖的提交也可以恢复。然而,任何你未提交的东西丢失后很可能再也找不到了。

远程仓库

查看远程仓库

  • git remote;
    • git remote -v: 显示url;

添加远程仓库

  • git remote add <shortname> <url>

拉取远程仓库中有但本地没有的信息

  • git fetch <shortname>:会将所有的分支中的信息都拉下来,但只会将数据下载到本地仓库,并不会自动合并或修改当前的工作,当准备好时手动将之合并到其中;
  • git pull:如果当前分支设置了跟踪远程分支,那么可以用git pull命令来自动抓取后合并该远程分支到当前分支;默认情况下,git clone命令会自动设置本地master分支跟踪克隆的远程仓库的master分支。运行git pull通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在分支;

推送到远程仓库

  • git push <remote> <branch>;

查看某个远程仓库

  • git remote show <remote>;

远程仓库的重命名与移除

  • 重命名:git remote rename <old> <new>
  • 移除:git remote remove/rm <remote>:一旦删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也都会一起被删除;

打标签

git可以给仓库历史中的某一个提交打上标签,以示重要。

列出标签

  • git tag -l/—list <parten-string>;

创建标签

创建附注标签

  • git tag -a <tag-name> -m “sss”
  • git show <tag-name>查看创建的tag;

创建轻量标签

  • git tag <tag-name>;
  • 这时使用git show看不到任何标签信息,命令只会显示提交信息;

对过去的提交打上标签

  • git tag -a <tag-name> <checksum>;

共享标签

默认情况下,git push并不会传送标签到远程仓库上,在创建完标签后必须显式地推动标签到共享服务器上:
  • git push <remote> <tag-name>
  • git push --tags:推送所有标签

删除标签

本地删除

  • git push <remote> -d <tag-name>

远程删除

  • git push origin —delete <tag-name>
  • git push origin :refs/tags/<tag-name>:将冒号前面的空值推送到远程标签名,从而高效地删除它;

检出标签

如果你想查看某个标签所指向的文件版本,可以使用git checkout命令;

git别名

  • git config --global alias.<alias-name> ‘origin cmd’;
例如:
git config --global alias.unstage 'reset HEAD --'
将下面两个指令等价起来:
  1. git unstage file
  1. git reset HEAD -- file

git分支

创建分支

  • git branch <name>:创建一个与当前分支指针指向同一个提交对象的指针;
  • 使用git log使用--decorate查看各个分支当前所指对象

HEAD指针

git中的特殊指针,保存当前所在的本地分支;

分支切换

  • git checkout <name>;

查看分支情况

  • git log --oneline --decorate --graph --all;

git远程分支

远程引用是对远程仓库的引用(指针),包括分支、标签等等。可以利用:
  • git ls-remote <remote>
来获得远程引用的完整列表,或通过:
  • git remote show <remote>
来显示远程分支的更多信息。
远程跟踪分支是远程分支状态的引用。它们是无法移动的本地引用。一旦进行了网络通信,git就会为你移动它们以精确反应远程仓库的状态,可以将它们看做书签,用于提醒你该分支在远程仓库中的位置就是你最后一次连接到它们的位置;
远程分支主要以形式:<remote>/<branch>命名;

更新远程跟踪分支

  • git fetch
当抓取到新的远程跟踪分支时,本地不会自动生成一份可编辑的副本,即不会有一个新的分支,而只是保存一个不可修改的远程分支指针。可以运行如下命令将抓取到的远程分支数据合并到当前所在分支:
  • git merge origin/<branch>;
  • git checkout -b serverfix origin/<branch>;

推送

  • git push <remote> <localbranch>:<remotebranch>;

跟踪分支

产生一个跟踪远程分支的本地分支:
  • git checkout -b <localbranch> <remote>/<branch>;

设置本地分支跟踪远程分支

  • git branch -u/—set-upstream-to origin/branch;

查看所有跟踪分支

  • git branch -vv;

拉取

  • git fetch会从服务器上抓取本地没有的数据,但不会修改工作目录中的内容,需要自己来进行合并;
  • git pull相当于git fetch + git merge,其会自动查找当前分支所追踪的远程分支,从其中抓取数据然后尝试合并;

删除远程分支

  • git push <remote> --delete <branch>

变基(rebase)

rebase是将一系列提交按照原有次序依次应用到另一个分支上,而合并是把最终结果合在一起;
 
一生一芯部分笔记ELF文件结构(理论+实践)