git指令记录

参考博客(侵权删):关于Git这一篇就够了_17岁boy想当攻城狮的博客-CSDN博客

Git工作区介绍_git 工作区_xyzso1z的博客-CSDN博客

https://zhuanlan.zhihu.com/p/90816644

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保存当前的工作状态

git cherry-pick将某一次的提交合到本地当前的分支上,然后可以一起merge

比如当前本地分支上存在两个分支时,有branch1和branch2,我们可以先查看各个分支的提交

//首先可以切换到branch2分支上,然后查看branch2上最近三次提交

$ git checkout branch2 
Switched to branch 'branch2'

$ git log --oneline -3
23d9422 [Description]:branch2 commit 3
2555c6e [Description]:branch2 commit 2
b82ba0f [Description]:branch2 commit 1

//切换到branch1分支上,查看一下branch1分支上最近三次的提交

$ git checkout branch1 
Switched to branch 'branch1'

$ git log --oneline -3
23d9422 [Description]:branch2 commit 3
2555c6e [Description]:branch2 commit 2
b82ba0f [Description]:branch2 commit 1

如果此时需要将branch2分支上第一次提交的内容合并到branch1分支上,则可以使用git cherry-pick 命令:

$ git cherry-pick 2555c6e
error: could not apply 2555c6e... [Description]:branch2 commit 2
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit

上面在cherry-pick没有成功提交时,说明存在冲突,所以首先需要解决冲突,然后要git commit提交

$ git commit
[branch1 790f431] [Description]:branch2 commit 2
 Date: Fri Jul 13 18:36:44 2018 +0800
 1 file changed, 1 insertion(+)
 create mode 100644 only-for-branch2.txt

或者git add . 然后git cherrypick --continue继续

除了这个方法还有可以使用git cherry-pick -n

$ git cherry-pick 23d9422
[branch1 2c67715] [Description]:branch2 commit 3
 Date: Fri Jul 13 18:37:05 2018 +0800
 1 file changed, 1 insertion(+)


查看提交log,它自动合入了branch1分支:

$ git log --oneline -3
2c67715 [Description]:branch2 commit 3
f8bc5db [Description]:branch2 commit 2
20fe2f9 commit second

如果不想进行自动合入,则使用git cherry-pick -n:

# 回退上次提交,再此进行cherry-pick
$ git reset --hard HEAD~
HEAD is now at f8bc5db [Description]:branch2 commit 2
$ git cherry-pick -n 23d9422
$ git status
On branch branch1
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   only-for-branch2.txt

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值