参考博客(侵权删):关于Git这一篇就够了_17岁boy想当攻城狮的博客-CSDN博客
Git工作区介绍_git 工作区_xyzso1z的博客-CSDN博客
git commit 命令详解_gitcommit_辰风沐阳的博客-CSDN博客
本博客只作为自己的学习记录,无商业用途!
git属于分布式版本控制系统,用于管理大型工程源代码。除了git还有SVN以及P4、csv这样的版本控制系统,相较于git,SVN、P4以及csv属于集中式版本控制系统。
分布式版本控制系统与集中式版本控制系统的区别
分布式版本控制系统:每一个电脑都属于一个服务器,在主仓库拉一份代码以后,则可以将自己的电脑作为服务器,自己在本地做的修改可以提交到主仓库。
集中式版本控制系统在每次coding时需要先拉一份代码,在服务器出现问题时,所有数据都会丢失,本地仅仅保存当前拉取的code信息。
集中式版本控制有一个主版本号,每次版本迭代都会以这个版本号为主,分布式因为每个客户端都是服务器,git没有固定的版本号,代码回滚会有一个哈希值作为代码ID,一般以master作为主仓库,我们可以push到master并合并到主仓库上,主仓库的版本号就会迭代一次,客户端的git迭代与master无关,只有在merge时才会合并一次。
Debian/Linux上搭建git
sudo apt install git
配置git环境:git config --global
//在首次使用git时需要设置用户名以及邮箱,作为当前客户端的git标识,在使用远程vscode时会要求登录。
//下面的命令需要复制完,user.name也需要加上
git config --global user.name "your name"
git config --global user.email "your email"
这里简单介绍一下git版本控制系统的工作区:主要分为工作区域(workspace)、暂存区(stage\Index)、本地仓库(repository)、远程仓库(remote directory)
workspace:工作区,就是平时存放项目代码的地方。
Index/Stage:暂存区,用于临时存放你的改动,事实上只是一个文件,保存即将提交到文件列表信息。
Repository:仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中一台电脑用于远程数据交换。
git工作流程:
1、在工作目录中添加、修改、删除文件(modified)。
2、将需要进行版本管理的文件放入暂存区(staged)。
3、将暂存区的文件提交给git仓库(commit)。
4、将本地仓库修改推送到远程仓库
git中文件的四种状态:
git不关心文件两个版本之间的具体差别,只关心文件的整体是否有改变。
1、untracked:未跟踪,此文件在文件夹中没有加到git仓库中,不参与版本控制,通过git add的状态可以转变为staged
2、unmodify:文件已入库,未修改,就是在版本库中的文件和文件夹中的完全一致,这种类型的文件有两种去处。在被修改时会变成modefied ;如果使用git rm移除版本库,就会变成untracked文件
3、Modified:文件已修改,通过git add指令可以进入暂存staged状态。使用git checkout则丢弃修改内容,返回unmodify状态
4、staged:暂存状态,执行git commit 则将修改同步到库中,文件变为unmodify状态,执行git reset HEAD filename取消暂存,文件变为Modified状态。
//创建本地仓库的条件是需要一个空目录,然后在空目录中初始化新项目
//init : 初始化当前目录为仓库,初始化以后会将当前仓库设置为master
//比如想创建一个example的空项目
mkdir example
cd example
git init
//在初始化以后会生成git的配置文件目录,就是隐藏目录,可以用Ctrl+h显示,或者ls -ah查看隐藏目录
//进入隐藏目录后可以查看相关配置文件
新建文件添加到本地仓库 git add / git commit -m
//add:是指将文件添加到缓存区
//commit:是指提交到本地仓库
//比如当前我想新建一个example.c文件,然后上传到本地仓库
//这里简单介绍一下git版本控制系统的工作区:主要分为工作区域(workspace)、暂存区(stage\Index)、本地仓库(repository)、远程仓库(remote directory)
cd example
touch example.c
git add test.c //这个命令是指将文件添加到本地仓库的提交缓存,此时还没有添加到本地仓库,
git commit -a //使用这个命令可以为修改的code添加注释;同时git commit会为我们生成40位的哈希值,
//作为codeID并把刚刚用git add添加到提交缓存区的文件提交到本地仓库,便于回滚
git commit -m //改写提交,-amend表示要重写上一次的提交信息
下面详细讲解一下git commit
# 将暂存区内容提交到版本库, 进入 vi 命令界面输入提交信息
git commit
# 将某些已被跟踪的文件提交到版本库(包含工作区和版本库)
git commit [file1] [file2] [...]
# 将暂存区内容提交到版本库, 无需进入 vi 命令界面输入提交信息
git commit -m [message]
# 跳过 git add, 将所有已被跟踪的文件更改提交到版本库
git commit -am [message]
# 使用一次新的commit, 替代上一次提交
# 如果代码没有任何新变化, 则用来改写上一次commit的提交信息
git commit --amend -m [message]
#如果需要将所有已被跟踪的文件更改内容,不想使用 git add,直接添加到版本库
#总结: git commit -m 用于提交暂存区中的文件,git commit -am 用于提交已被跟踪的文件
查看历史提交日志:git log
可以用于查看之前提交是否成功了
回滚代码仓库:git reset --hard
git reset --hard
reset是重置命令
--hard是重置代码的仓库版本
主要有三种模式,--soft、--mixed、--hard
使用--soft就是仅仅将头指针恢复,已经add的暂存区以及工作空间的所有东西都不变
--mixed将头恢复掉,已经add的暂存区也会丢失,工作空间的代码不变
--hard,所有东西都会恢复,
2、回滚当前仓库指向版本
HEAD表示当前仓库的指向,当前HEAD指向master时,就代表回滚到master上一次提交的版本
git reset --hard 要回滚的哈希ID
//可以用git log查看,在commit后面的就是
git reset --hard HEAD^
HEAD是指向当前仓库的,历史版本中可能有别的分支,当我们指向迭代我们仓库的上一个版本时,可以直接用HEAD来指向,就是上面的命令。
其中 ^代表上一个版本,HEAD代表当前仓库的指向,当前HEAD指向master时,代表要回到master上一次提交的版本
还有一种当时就是~3
git reset --hard HEAD~3
后面的~3表示以当前版本为基数,回滚多少次,HEAD~3表示回滚master之前的三个版本
查看提交以后文件是否做了改动,git status
git status :查看当前仓库的状态
将文件撤销回到最近一次修改的状态:git checkout --file
git checkout :切换参数,通常用于切换分支仓库,
git创建和查看分支:git branch、git checkout -b
git checkout -b dev //使用git checkout -b创建一个新分支后会自动切换过去
git branch //查看当前所在分支,也就是HEAD指向的分支。
git checkout -b等价于git branch + git checkout
git branch 后面如果跟着名字会创建分支,但是不会切换,git checkout 后面如果是分支名则会切换过去
git合并分支:git merge
如果需要将分支提交到master 仓库的话,只需要切换到master仓库,并执行git merger分支名就行
截止目前为止,github和gitlab提交本地仓库到远程仓库只需要:git add、git commit、git push就行。
git branch可以修改分支名
创造
克隆现有存储库
$ git clone ssh://user@domain.com/repo.git
创建一个新的本地存储库
$ git init
当地变化
Changed files in your working directory
$ git status
Changes to tracked files
$ git diff
将所有当前更改添加到下一个提交
$ git add .
在中添加一些更改到下一次提交
$ git add -p
提交跟踪文件中的所有本地更改
$ git commit -a
提交先前进行的更改
$ git commit
更改最后一次提交
不要修改已发布的提交!
$ git commit --amend
提交历史
显示所有提交,从最新开始
$ git log
显示特定文件随时间的变化e
$ git log -p
谁更改了中的内容和时间
$ git blame
分支机构和标签
列出所有现有分支
$ git branch -av
切换HEAD分支
$ git checkout
根据您当前的HEAD创建一个新分支
$ git branch
基于远程分支创建一个新的跟踪分支
$ git checkout --track
删除本地分支
$ git branch -d
用标签标记当前提交
$ git tag
更新和发布
列出所有当前配置的遥控器
$ git remote -v
显示有关遥控器的信息
$ git remote show
添加名为的新远程存储库
$ git remote add
从下载所有更改,但不要集成到HEAD中
$ git fetch
下载更改并直接合并/集成到HEAD中
$ git pull
在远程上发布本地更改
$ git push
删除遥控器上的分支
$ git branch -dr
发布标签
$ git push --tags
合并与基础
将合并到当前HEAD中
$ git merge
将当前的HEAD重新设置到
不要重新发布已发布的提交!
$ git rebase
中止基准
$ git rebase --abort
解决冲突后继续进行基准
$ git rebase --continue
使用您配置的合并工具解决冲突
$ git mergetool
使用编辑器手动解决冲突,并(在解决之后)将文件标记为已解决
$ git add
$ git rm
撤消
丢弃工作目录中的所有本地更改
$ git reset --hard HEAD
放弃特定文件中的本地更改
$ git checkout HEAD
还原提交(通过产生具有相反更改的新提交)
$ git revert
将HEAD指针重置为上一次提交
…并丢弃此后的所有更改
$ git reset --hard
…并将所有更改保留为未分阶段的更改
$ git reset
…并保留未提交的本地更改
$ git reset --keep
git branch -m 分支名 新的分支名
//可以使用git stash保存当前的工作状态