git入门大全
前言
以前写个一个git小结,但是实际上并不够用。于是结合实际工作上碰到的一些情况,参考了一些资料,重新总结了一下。目标是在日常工作中不用再去查阅其他的资料了,如果有什么遗漏或者错误的地方,请评论指出!
基本概念
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库
文件几种状态
- untracked:git未跟踪的文件,新增的文件未 git add 就会处于这种状态
- not staged:被索引过又被修改了的文件
- staged:通过 git add后即将被提交的文件
创建新仓库
# 在当前目录
git init
配置
# 显示当前的Git配置
git config –list
# 编辑Git配置文件
git config -e [–global]
# 设置提交代码时的用户信息
git config [–global] user.name "example"
git config [–global] user.email "example@gmail.com"
# 配置自动换行,提交到git时自动将换行符转换为lf
git config --global core.autocrlf input
# 配置密钥
ssh-keygen -t rsa -C example@gmail.com # 生成密钥
ssh -T git@github.com # 测试是否成功
# 配置别名,--global 表示全局配置
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
检出仓库
# 创建一个本地仓库的克隆版本:
git clone /path/to/repository
# 如果是远端服务器上的仓库:
git clone username@host:/path/to/repository
# 克隆到自定义文件夹:
git clone username@host:/path/to/repository my-cloned-repo
新建仓库常见流程
# 初始化
git init
# 获取状态
git status
git add README.md
git commit -m "message"
# 连接远程仓库
git remote add origin git@github.com:example/test.git
# 推送内容到远程仓库的同时设置默认跟踪分支
git push -u origin master
gitignore
vim .gitignore
!为模式取反
*.a
!lib.a
添加、删除
# 添加指定文件到暂存区
git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
git add [dir]
# 添加当前目录的所有文件到暂存区,.或*代表全部添加
git add .
# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
git add -p
# 删除工作区文件,并且将这次删除放入暂存区
git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
git rm --cached [file]
# 文件重命名,并加入暂存区
git mv [file-original] [file-renamed]
# 通配符批量移动
git mv *.html src/
提交
git commit -m "message"
# 补提交文件,提交时漏掉了某些文件时不应该再单独提交一次
git commit --amend
# 覆盖提交日期,不知道有啥实际用途
git commit -m "message" --date "2017-01-01 00:00:00"
branch
# 列出所有本地分支
git branch
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch]
# 切换到指定分支,并更新工作区
git checkout [branch-name]
# 切换到上一个分支
git checkout -
# 建立追踪关系,在现有分支与指定的远程分支之间
git branch --set-upstream [branch] [remote-branch]
# 根据一个特定的提交创建新分支,忘记开新的分支就修改并提交了代码时的处理
git branch test-branch HEAD~1
# 删除分支
git branch -d [branch-name]
# 重命名分支
git branch -m oldBranch newBranch
# 推送分支到远程仓库
git push origin [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
tag
# 列出所有tag
git tag
# 显示 tag list 和注解
git tag -n
# 在当前commit新建一个轻标签
git tag [tagname]
# 在指定commit新建一个tag
git tag [tagname] [commit]
# 添加注解标签
git tag -a [tagname]
# 添加注解标签并添加注解
git tag -am "message" [tagname]
# 删除本地tag
git tag -d [tagname]
# 删除远程tag
git push origin :refs/tags/[tagName]
# 推送所有tag
git push --tags
# 新建一个分支,指向某个tag
git checkout -b [branch] [tagname]
# 切换到tag
git checkout [tagname]
# tag和分支同名时,显示指定切换到tag
git checkout tags/[tagname]
远程仓库和合并分支
git remote
# 查看远程仓库的 URL
git remote -v
# 添加远程仓库
git remote add origin git@github.com:example/test.git
# 删除远程仓库
git remote rm origin
# 修改远程仓库地址
git remote set-url origin [url]
# 将本地的远端和远端进行同步
git fetch origin
# 将本地的远端合并到本地分支
git merge origin/master
# 拉取远程仓库,这相当于上面两条命令
git pull origin master
# 使用rebase可以使提交的历史记录显得更简洁
git rebase mater
# 也可以指定分支:
git pull origin remote:local
# 推送:
git push origin local:remote
改写提交
# 摘出某个提交
git cherry-pick [hash]
# 交互式提交,当涉及提交修改时使用,如 squash、调整 commit 顺序等
git rebase -i
git rebase -i HEAD~4
# 将 upstream 后的 commit 节点嫁接到 newbase,如果有 branch ,会先 checkout 到这个 branch,再 rebase
git rebase --onto <newbase> <upstream> <branch>
# 删除 topicA~3、topicA~4 这两个 commit
git rebase --onto topicA~5 topicA~3 topicA
# 中途要停止rebase操作
git rebase --abort
# 复原到rebase之前的状态
git reset --hard ORIG_HEAD
1)squash合并多个提交:
在编辑 commit message 时 hash 值前的p(pick)表示 use commit,s(squash)表示 use commit, but meld into privious commit
所以我们可以在 push 到远程仓库之前,把多个 commit 合并成一个。
2)edit使提交成退出状态
除了p、s,常用的还有e(edit)表示 use commit, but stop for amending。保存退出后,修改过的提交呈现退出状态。用 git commit --amend 保存修改,然后 git rebase --continue 。这时,有可能其他提交会发生冲突, 请修改冲突部分后再执行 git add 和 git rebase --continue 。这时不需要提交。
3)merge squash:
# 在 merge 特性分支时,把所有的新提交合并成一个
git merge feature-branch --squash
暂存
# 暂时将未提交的变化移除,稍后再移入
git stash
# 查看所有被隐藏的文件列表
git stash list
# 恢复暂存的文件,不从list中删除
git stash appl
# 从list中删除
git stash drop
# 恢复暂存的文件,并从list中删除
git stash pop
撤销
# 遗弃提交
git reset
# 把当前的 HEAD 重置到前一个,丢弃最新commit
git reset HEAD~1
# 撤销上一次提交,并且变更还保持在 staging area
git reset HEAD~1 --soft
--soft 只取消提交,将上一次的修改放入 staging area,不修改索引和工作树
--mixed 默认模式,复原修改过的索引的状态,将上一次的修改放入 working directory,修改索引,不修改工作树
--hard 彻底取消最近的提交,直接将上一次的修改抛弃,修改索引和工作树
三种都会修改HEAD位置
# 抛弃某一次的修改,使用上次提交的版本
git checkout
# 安全地取消过去发布的提交
git revert
git revert HEAD~2
1)git reset与checkout区别:
git reset 使用仓库中的版本覆盖 staging area 中的,如果 working directory 该文件没有其他修改,则 staging area 中的修改将应用到 working directory 中。反之working directory 中的版本将被保留,丢弃 staging area 中的修改。
git checkout 则是使用 staging area 的中的版本覆盖 working directory。
2)git revert与reset区别:
与 reset 不同的是,revert 只会撤销当前的 commit,而之后的 commit 操作的修改还会保留,但是 reset 还会将之后的所有 commit 操作的修改全部退回 staging area 或丢弃。
3)撤消合并:
假如还没推送到远端,可以reset掉
git reset --hard HEAD~
如果已经推动到远端,可以用revert
git revert -m 1 HEAD
diff
# 显示暂存区和工作区的差异
git diff
# 显示暂存区和上一个commit的差异
git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
git diff HEAD
# 显示两次提交之间的差异
git diff [first-branch]...[second-branch]
# 显示今天你写了多少行代码
git diff --shortstat "@{0 day ago}"
log
# 以图形展示
git log –graph
# 可以显示包含标签资料的历史记录
git log --decorate
# 单行显示过去5次提交
git log -5 --pretty --oneline
# 显示第一个父commit节点,而不显示merge的commit节点,这样会有一个更清晰的视图
git log –first-parent
# 显示全部分支
git log –all
# 更清晰地显示
git log --graph --decorate --pretty=oneline --abbrev-commit --all
git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
其他命令
# 查看某个文件的修改人
git blame
# 优化git仓库,git repack 将版本库未打包的松散对象打包
git repack -d
# 条件搜索及正则表达式搜索
git grep
git grep "TODO"
# 二分法查找快速定位到bug位置
git bisect
git bisect HEAD origin
git bisect run make test
git bisect reset
# 可以列出所有的操作记录,通过reflog找到 commit 的hash,然后 cherry-pick 找回
git reflog
# 获取命令的帮助信息
git help [命令]
git [命令] --help
# 获取当前的状态,git会提示接下来的能做的操作
git status
# Git 组织大型项目的一种方式
git submodule
git内部
Git仓库下有一个.git目录,一般包括下面的内容:
- config
- index
- HEAD
- hooks/
- info/
- logs/
- objects/
- refs/
1)config
仓库的配置文件
2)index
索引,index文件保存暂存区信息
3)HEAD
HEAD文件指示目前被检出的分支
4)objects
你提交到一个Git代码仓库中的所有文件,包括每个提交的说明信息(the commit info)都在目录 .git/objects/中存储为实体。
一个实体以一个40字符长度的字符串(该实体内容的SHA1哈希值)来标识。
实体有4类:
- blob - 存储文件内容
- tree - 存储目录结构和文件名
- commit - 存储提交的说明,组成Git的提交图谱
- tag - 存储带注解的标签(tag)
5)refs
Git中,一个分支(branch)、远程分支(remote branch)或一个标签(tag)(也称为轻量标签)仅是指向一个实体的一个指针,这里的实体通常是一个commit实体。
这些引用以文本文件的形式存储在目录.git/refs/中。
- refs/heads/xxx 本地分支
- refs/remotes/origin/xxx 远端分支
- refs/tags/xxx 本地tag
git提交规范
feat: 添加了xx功能
xx功能描述
阮一峰Commit message 和 Change log 编写指南
三种工作流程
1)Git flow:项目存在两个长期分支,主分支 master 和开发分支 develop。这个模式是基于"版本发布"的,而补是"持续发布"
2)Github flow:只有一个长期分支,就是 master,"持续发布"
3)Gitlab flow:Gitlab flow 的最大原则叫做"上游优先"(upsteam first),即只存在一个主分支 master,它是所有其他分支的"上游"。只有上游分支采纳的代码变化,才能应用到其他分支。
阮一峰Git 工作流程
命令行
常用命令行
pwd 显示当前工作目录 process working directory
cd 切换目录 change directory
mkdir 创建目录 make directory
mkdir -p 递归创建多个目录 --parents no error if existing, make parent directories as needed
ls 列出目录内容 list
ls -a 可以显示.开头的文件 all
ls -l 列出文件的详细信息 long listing format
touch 创建文件
rm/rmdir 删除文件/目录 remove
rm -r 删除目录 --recursively
mv 文件或目录的移动或更名 move
cp 将文件拷贝至另一文件 copy
echo 输出到文件 like echo 1 > test.txt
cat 显示文件内容和合并多个文件 like cat test.txt,also like cat file1 file2 > file
less 按页显示文件
clear 清屏(ctrl + l)
history 查看最近用过的命令
du 统计目录/文件所占磁盘空间的大小 disk usage
du -sh 以易读的方式显示总共大小 --summarize --human-readable
ps 报告程序状况 process status
head 显示开头某个数量的文字区块 like head -n 3 test.txt
tail 显示结尾某个数量的文字区块
ping 网络管理常用的3个命令
ipconfig
netstat
xxx -h 至少可以通过以下三种中的一种获取命令的帮助信息
xxx --help
man xxx
快捷键
Ctrl + A :光标移动到行首
Ctrl + E :光标移动到行尾
Ctrl + U :删除光标所在位置之前的所有字符(不含当前位置字符)
Ctrl + K :删除光标所在位置之后的所有字符(含当前位置字符)
Ctrl + W :删除光标所在位置之前的一个单词
Ctrl + R :根据输入搜索以往使用过的命令
小技巧
Alt + . 使用上一次命令的最后一个参数
!! 上一次命令
↑ 显示上一次命令
. 当前目录
.. 上一层目录
~ 根目录
- 上一次目录
| 管道(pipe),前一个命令的输出为后一个命令的输入,like cat test.txt | less
多个命令之间可以用;或&&分隔,前者命令错误不中断
vim
参考
git入门大全的更多相关文章
- git入门网站
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 git入门教程:对商业的.开源的. ...
- git入门及上传项目到github
Git入门: 如果你完全没有接触过Git,你现在只需要理解通过Git的语法(敲入一些命令)就可以将代码上传到远程的仓库或者下载到本地的仓库(服务器),我们此时应该有两个仓库,就是两个放代码 ...
- Git入门仅这篇就够了
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请表明出处:http://www.cnblogs.com/cavalier-/p/5978937.html 前言 大家好,我是Cavalier ...
- git入门学习(二):新建分支/上传代码/删除分支
一.git新建分支,上传代码到新的不同分支 我要实现的效果,即是多个内容的平行分支:这样做的主要目的是方便统一管理属于同一个内容的不同的项目,互不干扰.如图所示: 前提是我的github上已经有we ...
- git入门学习(一):github for windows上传本地项目到github
Git是目前最先进的分布式版本控制系统,作为一个程序员,我们需要掌握其用法.Github发布了Github for Windows 则大大降低了学习成本和使用难度,他甚至比SVN都简单. 一.首先在g ...
- Git入门简介
1. Git 背景 Git 最初由Linus Torvalds编写,用于 Linux 内核开发的版本控制工具. Git 与常用的版本控制工具 CVS.Subversion 等不同,它采用了分布式版本 ...
- [置顶] 【Git入门之十五】Github操作指南
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12374633 最终篇,介绍一下Github网站的使用,主要是翻译为主,简化了 ...
- Git入门—创建项目
Git入门—创建项目 注:win10系统下 打开Git Bash,进入存放仓库的目录 创建 初始化git init,该命令执行完后会在当前目录生成一个 .git 目录. 所有 Git 需要的数据和资源 ...
- git 入门教程
git 入门教程之协同开发 前面我们已经介绍过远程仓库的相关概念,不过那时并没有深入探讨,只是讲解了如何创建远程仓库以及推送最新工作成果到远程仓库,实际上远程仓库对于团队协同开发很重要,不仅仅是团队协 ...
随机推荐
- openssl req(生成证书请求和自建CA)
伪命令req大致有3个功能:生成证书请求文件.验证证书请求文件和创建根CA.由于openssl req命令选项较多,所以先各举几个例子,再集中给出openssl req的选项说明.若已熟悉openss ...
- H3CNE实验:Comware基本命令操作
第1步:Comware命令视图及切换操作 <H3C>system-view System View: return to User View with Ctrl+Z. [H3C]quit ...
- Java虚拟机面试重点-------------内存分配和回收策略
1 对象优先分配在Eden区 对象优先在Eden进行分配,大多数情况下,对象在新生代Eden区进行分配.当Eden区没有足够的空间进行分配时,虚拟机会发起一次Minor GC. 新生代GC(Ninor ...
- 浅入深出之Java集合框架(上)
Java中的集合框架(上) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,如果已经有java基础的小伙伴可以直接跳到<浅入深出之Java集合框架 ...
- 在线用户数-Constants
package com.pb.news.constants; public class Constants { public static int ONLINE_USER_COUNT=0;//在线用户 ...
- [基础架构]PeopleSoft Application Server 重要文件说明
我们都知道PeopleSoft是由几个不同的服务组成的,他们在PeopleSoft体系结构中扮演着自己的角色.这些服务具有不同的文件结构并包含重要的可执行文件和配置文件. 以下是Peoplesoft体 ...
- Windows10中“SQL Server 配置管理器”哪去了?
SQL Server 配置管理器是一种工具,用于管理与 SQL Server 相关联的服务.配置 SQL Server 使用的网络协议以及从 SQL Server 客户端计算机管理网络连接配置.SQL ...
- 实现一个栈类,类似STL中的栈
1.思路讲解 stack集合类是一个简单的堆栈的实现. 这里有两个模板参数,T和size,T用于指定堆栈中的元素类型,my_size用于表示堆栈中项数的最大值. 类中添加方法isempty.isful ...
- 【转载】BAT 批处理脚本教程
来源:http://www.cnblogs.com/glaivelee/archive/2009/10/07/1578737.html BAT 批处理脚本 教程 第一章 批处理基础第一节 常用批处 ...
- android6.0动态权限处理<一>
android 6.0以上为了保护用户的隐私,和以往被人诟病的权限机制,确立了新的权限机制.从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授 ...