一、安装

具体查看 安装Git

windows下git bash坑

不能使用上/下键切换选项

参考:https://blog.csdn.net/csdn_yudong/article/details/86613435

推荐直接使用数字代替,从1开始

二、使用

基础知识

  • 工作区(Workspace):就是你在电脑里能看到的项目目录。
  • 暂存区(Index / Stage):临时存放更改的地方,使用命令"git add <.|file>"就是把文件加入暂存区。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库(Repository):管理版本的文件,使用"git commit -m 'description'"就是把暂存区的文件提交到版本库。工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
  • 远程仓库(Remote):托管代码的服务器。可以简单的认为是你项目组中的一台电脑用于远程数据交换

一张图描述git的文件如何在各个区域之前流转:

origin:远程仓库库默认别名

master:  仓库默认分支的名称
 

本地项目初始化/和远程仓库操作

git init,把当前文件夹初始化位git工程

git remote add [<options>] <name> <url>  把当前文件夹关联远程仓库并命名,比如git remote add origin git@server-name:path/repo-name.git;
git remote -v 查看远程仓库地址

git push <远程主机名> <本地分支名>  <远程分支名>,比如 git push origin dev dev
git push -u origin master 如果当前分支与多个主机存在追踪关系,则可以使用 -u 参数指定一个默认主机,这样后面就可以不加任何参数使用git push
git remote set-url origin git@your.server:new-name.git // 修改远程仓库名称。要确保新的仓库已经再远程存在才行
 

基本操作:添加/提交/查看记录

"git add ."或者"git add <file>",将所有文件或指定文件从工作区添加到暂存区
git commit -m "description",将暂存区的所有文件提交到版本库
git commit --amend -m "xxxx",修改上一次的提交信息
git show <commitId> <filename> :查看提交详情
git status,查看当前工作区和暂存区的文件状态
git diff,查看当前工作区对比暂存区的更改
git diff HEAD -- readme.txt命令可以查看工作区和版本库里面最新版本的区别
“git log”或"git log <file>",查看版本库或者指定文件的提交记录
git log --graph命令可以看到分支合并图。
git log --pretty=oneline --graph --abbrev-commit展示效果如下

git cherry-pick <commitId>,复制一个特定的提交到当前分支,比如master分支的bug修复提交复制到dev分支

git cherry-pick commitId1..commitId100,复制两个commit之间的提交到当前分支,注意:不包括commitId1

若要合并某个分支上的一系列提交,还有另一种方式。
需要使用rebase指令进行合并操作
具体操作步骤:
// 以**最后一次提交**为节点, 创建一个新的分支<newbranch 是新分支的名字>
1. git checkout -b newbranch 最后一次提交的id
// 再 rebase 这个新分支的commit到目标分支上<--onto 目标分支>。<start_id> 指明你想从哪个特定的commit开始。
2. git rebase --onto 目标分支 start_id
 

仓库分支管理

查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>或者git switch <name>
创建+切换分支:git checkout -b <name>或者git switch -c <name>
比如git checkout -b dev,切换并创建dev分支,相当于
$ git branch dev
$ git checkout dev
合并某分支到当前分支:git merge <name>
正常合并如果能用fast-forward就会使用, 但这种模式下,删除分支后,会丢掉分支信息。可以使用--no-ff强制禁用ff模式
git merge --no-ff -m "merge with no-ff" dev
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
git branch -d <name>,删除本地分支:
git push origin --delete 分支名,删除远程分支
git push origin :分支名,删除远程分支,同上
git branch -m old_branch new_branch,本地分支更名
 

代码回退

看上面的几个区域的图基本就能明白

"git reset HEAD" 或者"git reset HEAD <file>"命令,暂存区的目录树或文件会被重写,被 master 分支指向的目录树或文件所替换,但是工作区不受影响。

git reset --hard HEAD^/git reset --hard 1094a,强制回退上一个版本/回退到指定版本号的版本,版本库会直接回退(远程仓库不会回退),需要特别谨慎。版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了

"git rm --cached <file>" 命令,会直接从暂存区删除文件,工作区则不做出改变。

"git checkout ." 或者 "git checkout -- <file>" 命令,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

"git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

“git revert HEAD/git revert commitID”: 放弃已经push的指定版本的修改,会新增一条记录,版本会递增
"git reflog" , 用来查看你的每一条命令,用来配合上面的命令恢复你的误操作
 
例1:将单个文件(a.js)回退到某一版本
  1. git  log a.js查看a.js的更改记录
  2. git reset   fcd2093  a.js 先将暂存区中的该文件回退到历史版本fcd2093
  3. git checkout -- a.js 暂存区中该文件的历史版本(fcd2093)覆盖工作区中对应的文件,此时(工作区、暂存区的文件a.js是fcd2093版本)。
【注】git reset [选项]  [版本号]  [回退对象]命令,当回退对象是文件时选项不能为hard
【注】2、3步可以合并成一步git checkout fcd2093 a.js
此时,如果git commit 提交暂存区的数据到版本库,则会重新生成一条记录
 
例2:将整个项目(远程仓库和本地仓库当前版本一致)回退到某个版本,并push到远程仓库,让远程仓库也回退。
  例如,版本库最新的几条提交记录是:aaaa -> bbbb -> cccc;cccc是最新的提交记录,要回退到aaaa并push
  1. git reset --hard aaaa 强制将版本库回退到aaaa,但是远程仓库还是cccc
  2. git reset cccc 将head移到最新的版本(和远程的head保持一致,实际就是将远程暂存区的内容更新到最新版本cccc,工作区的内容还是保持在aaaa),此时aaaa和cccc的差异便作为本次更改的内容。
  3. git add / git commit / git push 提交后生成新的版本号dddd

此时git log 看到的最近的提交记录就是:aaaa -> bbbb -> cccc -> dddd

【注】也可以使用git revert cccc 和 git revert bbbb来实现,不过会新增两条回滚记录

 

保留半成品现场(存储临时现场)

主要用在目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容
git stash 存储临时现场
git stash list 查看工作临时现场
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了
你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:
git stash apply stash@{0}
 
 

子模块

有时工程太过庞大想要分出子工程单独管理,或者纳入一个子工程到当前工程来,就可能用到子模块功能。

git子模块配置处理(即git的B仓库被作为A仓库的子目录),两个仓库可以各自管理和提交
git submodule add <path> <name>:将<path>对应的仓库作为当前仓库A的<name>子目录
git status:在A中查看发现多了<name>和 .gitmodules(这个文件中是子模块的相关配置)
git diff --cached <name>:在A中看到无法查询子模块的提交记录, 取而代之的是,Git 将它记录成来自B仓库的一个特殊的提交(这个提交在克隆的该项目时,进入子模块就是进入到这个提交)
例如,子模块B的名称为subproject_demo:
$ git diff --cached subproject_demo
diff --git a/subproject_demo b/subproject_demo
new file mode 160000
index 0000000..aa1eeb0
--- /dev/null
+++ b/subproject_demo
@@ -0,0 +1 @@
+Subproject commit aa1eeb06e67608d7a2af179a7dfd9e594777e90f
git commit -m 'first commit with submodule xxx': 结果中注意 subproject_demo条目的 160000 模式。这在Git中是一个特殊模式,基本意思是你将一个提交记录为一个目录项而不是子目录或者文件。
当你使用clone克隆该项目(父工程A)时,会发现子模块的文件夹内容为空,需要做:
git submodule init: 初始化你的本地配置文件
git submodule update:从子模块B拉取所有数据并检出你上层项目里所列的合适的提交(保持子模块是最新的那个)
进入子模块,发现子模块是那个项目的 你先前提交的确切状态的分支
chen_@DESKTOP-TJKEMKG MINGW64 /c/works/demo/subproject_demo  ((aa1eeb0...))
// 发现没:aa1eeb0就是之前的哪个提交

如果你在项目中改了子模块的代码,准备提交到对应的分支(add和commit已经执行过),使用:

git push origin HEAD:<branch>   这样就把代码提交到对应的分支 ,和 git push origin <localBranch> <remoteBranch>类似

如果其他人有修改这个子模块并提交到A工程,你可以重新pull A项目分支,然后执行git submodule update保证子模块也是最新的
git clone --recurse-submodules <repositary> ,他就会自动初始化并更新仓库的每一个子模块
 
【注】使用时要注意,最好保证在父工程A中来自B的提交永远来自同一个B的分支,比如master分支。所以B的分支代码更改完毕并测试完毕合并到master后,再在A提交来自B的master分支的提交

【注】引入私有git工程还可以又其他方式,比如和npm配合:《2018 年了,你还是只会 npm install 吗》查看“私有 git 共享 package”部分

打标签

你可以使用 阿里的AoneFlow模式 使用Git做分支管理,每次发完版本之后需要给当前的master打一个tag,表示发布的一个版本,以便追溯。

git tag,展示所有已经打过的标签

git tag -l 'v1.8.5*',匹配特定的标签查看

git tag -a v1.4 -m "my version 1.4",打附注标签

git tag -a v1.4 932cab, 后期给932cab提交补打上标签

git tag v1.4-lw,打轻量标签,没有标签信息

git tag -d v1.4,删除表情按【谨慎】

git git push origin :refs/tags/v1.4,删除远程v1.4这个标签

git show v1.4,命令可以看到标签信息与对应的提交信息

git push origin v1.4,共享标签,默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上

git push origin --tags,一次性把所有标签push到远程

【注】:更详细查看https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE

https和ssh使用

查看链接:https://blog.csdn.net/qq_42108192/article/details/90168968

https模式下添加git账号到项目,push不用每次输入账号密码

打开.git文件的下的 vim .git/config新增以下内容

[user]
name = XXXX05@qq.com
email = XXXX05@qq.com
[credential]
helper=store

三、踩坑

[remote rejected]  (hook declined)

完整日志:

$ git push
Enumerating objects: , done.
Counting objects: % (/), done.
Delta compression using up to threads
Compressing objects: % (/), done.
Writing objects: % (/), 1.20 KiB | 1.20 MiB/s, done.
Total (delta ), reused (delta )
remote: git: 'refs/heads/web2.0' is not a git command. See 'git --help'.
remote: error: hook declined to update refs/heads/web2.
To https://e.coding.net/tops/front-www.git
! [remote rejected] web2.0 -> web2.0 (hook declined)
error: failed to push some refs to 'https://e.coding.net/tops/front-www.git'

百度查看帮助,找到类似的问题:https://blog.csdn.net/weixin_39278265/article/details/102248258

本人的问题解决办法

git config --global --unset branch.web2..merge

然后再push就OK

如果觉得本文不错,请点击右下方【推荐】!

Git基础常用功能的更多相关文章

  1. Git 基础 —— 常用命令

    Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 git init 创建 Git ...

  2. git基础常用命令

    常用命令 git init //初始化本地git环境 git clone XXX//克隆一份代码到本地仓库 git pull //把远程库的代码更新到工作台 git pull --rebase ori ...

  3. git基础常用维护命令

    开发模式介绍 master为生产环境分支 trunk为测试环境分支 开发分支由程序员自己取名 比如来一个新项目之后,下面步骤都是在本地操作 1.从本地获取远程master最新代码,保证本地master ...

  4. python 基础——常用功能片段

    1. 元素去重 data = [1,2,3,4,4,5,5,6] res = set(data) 2. 元素去重排序 res = sorted(set(data)) 2. 打印重复的元素 res = ...

  5. Git基础 —— Github 的使用

    Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 Github 的利用 Gith ...

  6. Git 基础 —— 常见使用场景

    Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 突然插入 Bugifx 工作, ...

  7. Git 基础 —— 安装 配置 别名 对象

    Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 Git 安装 Git下载地址 ...

  8. ###Git 基础图解、分支图解、全面教程、常用命令###

    一.Git 基础图解 转自:http://www.cnblogs.com/yaozhongxiao/p/3811130.html Git 图解剖析 git中文件内容并没有真正存储在索引(.git/in ...

  9. Git是什么、Git的功能、为什么versioncontrol用Git、Git的常用命令、Git的优缺点

    Git是什么 git是目前世界上最先进的分布式版本控制系统(没有之一). Git是用于 Linux内核开发的版本控制工具.与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版 ...

随机推荐

  1. npm脚本和package.json

    1.什么是npm脚本 在创建node.js项目如一个vue项目,或一个react项目时,项目都会生成一个描述文件package.json . 比如npm允许在package.json文件里面,使用sc ...

  2. Mybatis入门案例中设计模式的简单分析

    Talk is cheap, show me the code! public class TestMybatis { public static void main(String[] args) t ...

  3. 解决Jsp与Java后台之间url传值中文乱码问题

    JSP页面中,由JavaScript拼接url时,对于中文名称变量应该加上encodeURIComponent方法,对中文进行十六进制编码. 例如: url = /com/xxx/B.jsp?chin ...

  4. Python socket套接字通信

    一.什么是socket? socket是一个模块, 又称套接字,用来封装 互联网协议(应用层以下的层). 二.为什么要有socket? socket可以实现互联网协议 应用层以下的层 的工作,提高开发 ...

  5. Callable,阻塞队列,线程池问题

    一.说说Java创建多线程的方法 1. 通过继承Thread类实现run方法   2. 通过实现Runnable接口 3. 通过实现Callable接口 4. 通过线程池获取 二. 可以写一个Call ...

  6. 曹工说Spring Boot源码(7)-- Spring解析xml文件,到底从中得到了什么(上)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  7. C++简单项目--推箱子

    在处理移动的时候有太多种情况了: 1.有空位 2.在推箱子,推到了空地 3.推箱子推到了目标, 4.推目标位的箱子推到另一个目标 5.推目标位的箱子推到空地 首先记录目标位置,在每次推动之后会再绘画中 ...

  8. Asp.Net Core下的开源任务调度平台ScheduleMaster

    从何说起 2017年初的时候,由于当时项目需要做了一个乞丐版定时调度系统,那时候只在单机上实现了核心的调度功能.做这个玩意之前也调研了社区中开源的解决方案,找了几个实地部署试跑了一下,其实都很不错.但 ...

  9. 机器学习-特征工程-Missing value和Category encoding

    好了,大家现在进入到机器学习中的一块核心部分了,那就是特征工程,洋文叫做Feature Engineering.实际在机器学习的应用中,真正用于算法的结构分析和部署的工作只占很少的一部分,相反,用于特 ...

  10. OpenGLES思维导图

    两本书到头来就只剩下了这三张图了吧.想要原图:https://github.com/wangwangla/biji/blob/master/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8 ...