Git版本控制

集中化版本控制系统

image.png

分布式版本控制系统

image.png

Git工作原理

image.png

Git文件的四种状态

image.png

  • Untracked: 未加入到git库,即文件未被跟踪。通过git add 可以变为Staged状态
  • Unmodified:已经加入git库,未修改, 即版本库中的文件快照内容与文件夹中还完全一致。使用git remove移出版本库, 则成为Untracked文件。
  • Modified:文件被修改
  • staged:暂存状态. 执行git commit则将修改同步到库中, 此时版本库中的文件和本地文件又变为一致, 文件为Unmodified状态.

Git工作区域

image.png

  • Workspace:本地的文件和目录
  • Index/Stage:暂存区,即记录用户操作,一般存放在 .git目录下,即.git/index,临时存放未提交的改动。
  • Repository:本地版本库,git clone 就是把远程仓库克隆到本地仓库。其中HEAD指向最新放入仓库的版本。执行git commit,文件改动提交到本地版本库。
  • Remote:远程仓库,类似github

Git工作流程

image.png

  • 从远程仓库拉取文件代码;
  • 在workspace,增删改查;
  • 提交文件至暂存区;
  • 提交文件至本地版本库;
  • 本地版本库文件推送至远程仓库;

Git基本常用命令

image.png

git初始化配置
git --version     查看git版本

git config --list   查看是否配置用户和邮箱(每次提交都会引用-必配)

git config --system  当前设备的所有用户
git config --config  只适用于当前用户
git config           仅对当前项目其作用
git config --config user.name "demo"   指定用户
git config --config user.email "[email protected]"  指定邮箱
git目录结构
git init   初始化仓库
find ./ -type f   查看文件,不包括目录

image.png

git对象(存储内容)——blob
key(hash值):value(数据)
echo 'test content' | git hash-object -w --stdin  标准输入流存储数据(返回对应的hash值)

git hash-object 文件路径(返回对应的hash值)

git cat-file -p hash值    查看对应的文件内容

git cat-file -t hash值    查看对应的对象
树对象(存储git对象,暂存区快照版本)——tree
和stage区域有关,git对象和stage区域无关
暂存区的数据提交到版本库后,暂存区的信息不会丢失
git ls-files -s   查看stage/index区域的信息

find ./.git/objects/ -type f  查看版本库信息
commit对象(版本库项目版本)——commit
封装树对象,即用户、注释等

git add

实际流程:workspace先提交到版本库再提交到暂存区,不是常规理解的提交
git add .    添加当前目录的所有文件到暂存区
git add [dir]    添加指定目录到暂存区,包括子目录
git add [file1]    添加指定文件到暂存区

git rm filename  删除文件
git mv filename1 filename2  修改文件

git commit

git commit -m [message] 提交暂存区到仓库区,message为说明信息
git commit [file1] -m [message] 提交暂存区的指定文件到本地仓库
git commit --amend -m [message] 使用一次新的commit,替代上一次提交    修改日志
git commit -a -m [message] 把所有已经被追踪的文件一起暂存并提交

git push

git push  origin master 将本地分支的更新全部推送到远程仓库master分支。  origin:地址别名   master:本地分支
git push origin -d    删除远程branchname分支
git push --tags 推送所有标签

git status

git status  查看当前工作区暂存区变动
git status -s  查看当前工作区暂存区变动,概要信息
git status  --show-stash 查询工作区中是否有stash(暂存的文件)

git log

记录HEAD指向之前的记录
git log  查看提交历史
git log --oneline 以精简模式显示查看提交历史
git log -p  查看指定文件的提交历史
git blame  一列表方式查看指定文件的提交历史

git diff

git diff 显示暂存区和工作区的差异
git diff filepath   filepath路径文件中,工作区与暂存区的比较差异
git diff HEAD filepath 工作区与HEAD ( 当前工作分支)的比较差异
git diff branchName filepath 当前分支的文件与branchName分支的文件的比较差异
git diff commitId filepath 与某一次提交的比较差异
git diff --staged/--cached   查看暂存区和repository的差异

git clone

已经将所有的分支都clone下来了,但是在本地只是显示master分支,注意这个master是本地的master分支,直接切换到对应的分支即可
git clone url 克隆远程版本库,当克隆的时候自动生成一个master分支(已经与远程跟踪分支建立了联系);其它操作都需要手动建立联系

git checkout -b 本地分支名 remote/branch  创建一个分支并与远程分支建立了联系

git checkout ---track remote/branch  创建一个分支与远程分支分支相同的分支并建立了联系

git branch -u remote/branch  已经存在的分支与远程分支建立联系

git checkout -b dev

克隆完之后,新建一个开发分支,比如新建开发分支dev

git checkout -b dev 创建开发分支dev,并切换到该分支下

git pull/git fetch

git pull = git fetch+ git merge
pull:拉取远程分支并与本地分支合并
fetch只是拉远程分支,不合并数据,需要手动合并数据
git pull  拉取远程仓库所有分支更新并合并到本地分支。
git pull origin master 将远程master分支合并到当前本地分支
git pull origin master:master 将远程master分支合并到当前本地master分支,冒号后面表示本地分支
git fetch --all  拉取所有远端的最新代码
git fetch origin master 拉取远程最新master分支代码

git branch

分支:①本地分支 ②远程分支 ③远程跟踪分支(remote/branch)
本质:指向提交对象的可变指针
切换分支维护的位置:①HEAD ②index ③workspace
PS:每次切换分支一定要保持分支干净,即commit;否则会出现垃圾数据渗透到其它分支的现象
git checkout -b dev2  新建一个分支,并且切换到新的分支dev2
git branch dev2 新建一个分支,但是仍停留在原来分支
git branch    查看本地所有的分支
git branch -r  查看所有远程的分支
git branch -a  查看所有远程分支和本地分支
git branch -D   删除本地branchname分支
git checkout master 切换到master分支
git checkout --track origin/customerbranch  本地自动创建一个与远程分支相同的分支
git branch -u origin/customerbranch 本地创建的分支与远程的分支建立联系
git branch -vv 查看所有跟踪分支

git merge

git merge master  在当前分支上合并master分支过来
git merge --no-ff origin/dev  在当前分支上合并远程分支dev
git merge --abort 终止本次merge,并回到merge前的状态

Git解决冲突

Git 解决冲突步骤:

  • 查看冲突文件内容
  • 确定冲突内容保留哪些部分,修改文件

     *   <<<<<<>>>>>> dev是指dev分支上修改的内容 
    
  • 重新提交,done

Git撤销与回退

Git版本控制_第1张图片
Git版本控制_第2张图片

git checkout

文件在工作区,未添加到暂存区,可以使用git checkout撤销

git checkout -- [file]  丢弃某个文件file
git checkout .  丢弃所有文件

git reset

修改HEAD的位置,即将HEAD指向的位置改变为之前存在的某个版本
git reset HEAD --file  回退暂存区里的某个文件,回退到当前版本工作区状态
git reset –-soft 目标版本号 可以把版本库上的提交回退到暂存区,修改记录保留
git reset –-mixed 目标版本号 可以把版本库上的提交回退到工作区,修改记录保留
git reset –-hard 目标版本号 可以把版本库上的提交彻底回退,修改的记录全部revert。

git revert

revert复制那个想要回退到的历史版本,将它加在当前分支的最前端。
git log  得到你需要回退一次提交的commit id
git revert -n   撤销指定的版本,撤销也会作为一次提交进行保存

Git标签tag

git tag  列出所有tag
git tag [tag] 新建一个tag在当前commit
git tag [tag] [commit] 新建一个tag在指定commit
git tag -d [tag] 删除本地tag
git push origin [tag] 推送tag到远程
git show [tag] 查看tag
git checkout -b [branch] [tag] 新建一个分支,指向某个tag

git rebase

rebase又称为衍合,是合并的另外一种选择(保持代码提交的简洁性)。多个提交合并为一条
不要和已经push到仓库的合并
git merge dev:
 D--------E
 /          
 A---B---C---F----G---   test, master
 git rebase dev:
 
A---B---D---E---C‘---F‘---   dev, master
获得更优雅的提交树,可以线性的看到每一次提交,并且没有增加提交节点。
git pull --rebase

git stash

可用于临时保存和恢复修改
场景:暂时切出分支提交一个未开发完成的对象(保证branch的干净)
git stash  把当前的工作区隐藏起来 等以后恢复现场后继续工作
git stash list 显示保存的工作进度列表
git stash pop stash@{num} 恢复工作进度到工作区
git stash show :显示做了哪些改动
git stash drop stash@{num} :删除一条保存的工作进度
git stash clear 删除所有缓存的stash。

git reflog

记录所有的提交

git blame filepath

记录了某个文件的更改历史和更改人

git remote

git remote   查看关联的远程仓库的名称
git remote add url   添加一个远程仓库
git remote show [remote] 显示某个远程仓库的信息

忽略文件

git 中文件有两类,共三种状态:

  • untracked
  • tracked

    • changes not staged for commit
    • changes to be committed;.gitignore文件里添加相应的文件夹或文件就能忽略掉不想被 track 的文件。.gitignore文件只能忽略Untracked files,不能忽略已经被track的文件;如果想利用.gitignore忽略已经track的文件,可以先将已经track的文件解除追踪,然后在重新追踪。
1、忽略已经 track的文件夹:
    git ls-files -z node_modules/ | xargs -0 git update-index --assume-unchanged
    
2、忽略单个文件
    git update-index --assume-unchanged 

PS:update-index 不支持递归`-r`,只能通过上面提到的方法来实现忽略文件夹

3、将 tracked 文件移出 index,但仍然保留在本地:删除了整个文件夹 commit 之后,项目要跑起来,又要重新`npm install
    git rm --cached -r node_modules
    
    
    

你可能感兴趣的:(git运维)