git命令行操作详解
1.常用操作
1.1 新建代码库
# 在当前目录新建一个Git代码库
git init
# 新建一个目录,将其初始化为Git代码库
git init [project-name]
# 下载一个项目和它的整个代码历史
git clone [url]
1.2 配置
# 显示当前的Git配置
git config --list
# 编辑Git配置文件
git config -e [--global]
# 设置提交代码时的用户信息
git config [--global] user.name "[name]"
git config [--global] user.email "[email address]"
1.3 remote管理
# 远程主机名(git要求每个远程主机都必须指定一个主机名,克隆的时候会被自动命名为origin)
git remote
# 如果clone时候想用其它主机名,则加-o选项
git clone -o jQuery https://github.com/jquery/jquery.git
# 查看远程主机网址
git remote -v
# 查看主机详细信息
git remote show origin
# 添加远程主机
git remote add origin https:git.xxxx.git
# 删除远程主机
git remote rm origin
# 远程主机改名
git remote rename origin neworigin
1.4 添加和撤销操作
# 显示有变更的文件
git status
# 该文件内容恢复到上个commit状态
git checkout -- <file>
# 所有文件恢复到上个commit状态
git checkout .
# 修改的该文件放入暂存区
git add <file>
# 所有修改的文件放入暂存区
git add .
# 取消add操作,保留文件的修改
git reset HEAD <file>
# 取消所有的add操作
git reset HEAD .
# 添加commit信息
git commit -m 'your commit message'
#回退所有内容到上一个版本
git reset HEAD^
#向前回退到第3个版本
git reset HEAD~3
# 将本地的状态回退到和远程的一样
git reset origin/master
# 回退到某个版本
git reset 版本号
注意:reset命令有3种方式:
1> git reset –mixed:此为默认方式,不带任何参数的git reset,即时这种方式,它回退到某个版本,只保留源码,回退commit和index信息(需要git add ., git commit -m "xx")
2> git reset –soft:回退到某个版本,只回退了commit的信息,不会恢复到indexfile一级。如果还要提交,直接commit即可(git add . 内容不会丢,可以直接git commit -m "xxx")
3> git reset –hard:彻底回退到某个版本,本地的源码也会变为上一个版本的内容(丢弃所有内容)
1.5 代码提交
# commit信息
git commit -m "first commit"
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
git commit --amend -m [message]
# 本地只是修改commit的信息,没有新的文件更改
git commit --amend "xxxxx"
# 本地修改,但是有新的文件需要添加
git log //找到回退到的版本号xxx
git reset xxx //然后修改文件
git add .
git commit -m "xxx"
# 修改已经提交到远程的commit信息
git commit --amend 'xxx2' //先本地修改commit信息(git reset xxx等方式也可以),然后再强制推上去,慎用
git push --force origin master
# 回退某个文件到某个版本
git log test.php
git reset 9aa51d89799716aa68cff3f30c26f8815408e926 test.php
1.6 分支操作
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 列出所有本地分支和远程分支
git branch -a
# 创建分支
git branch test
# 切换分支
git checkout test
# 创建并切换分支
git checkout -b test
# 切换到远程分支
git fetch
git checkout -b test origin/test
# 新建一个分支,指向指定commit
git branch [branch] [commit]
# 新建一个分支,指向某个tag
git checkout -b [branch] [tag]
# 合并指定分支到当前分支
git merge [branch]
# 删除分支(分支已经被合并)
git branch -d [branch-name]
# 删除分支(分支还没合并,强制删除掉)
git branch -D [branch-name]
# 批量删除分支方法
git branch |grep 'branchName' |xargs git branch -D
# 删除远程分支
git branch -dr [origin/test]
git push origin :master
git push origin --delete master
# 选择一个commit,将该commit改动下的代码合并进当前分支
git cherry-pick [commit]
1.7 查看信息
# 显示有变更的文件
git status
# 显示当前分支的版本历史
git log
# 显示commit历史,以及每次commit发生变更的文件
git log --stat
# 显示某个文件的版本历史,包括文件改名
git log --follow [file]
git whatchanged [file]
# 显示指定文件相关的每一次diff
git log -p [file]
# 显示指定文件是什么人在什么时间修改过
git blame [file]
# 显示暂存区和工作区的差异
git diff
# 显示工作区与当前分支最新commit之间的差异
git diff HEAD
# 显示两次提交之间的差异
git diff [first-branch]...[second-branch]
# 显示某次提交的元数据和内容变化
git show [commit]
# 显示某次提交发生变化的文件
git show --name-only [commit]
# 显示某次提交时,某个文件的内容
git show [commit]:[filename]
# 显示当前分支的最近几次提交,可以看到你使用了什么操作
git reflog
1.8 pull操作
# 取回远程主机某个分支的更新,再与本地的指定分支合并
git pull <远程主机名> <远程分支名>:<本地分支名>
# 取回origin主机的next分支,与本地的master分支合并
git pull origin next:master
# 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
git pull origin next
# 建立追踪关系(git会自动在本地分支和远程分支之间建立一种追踪关系,默认本地分支和远程分支同名,例如next->origin:next)
git branch --set-upstream master origin/next
1.9 push操作
# 把本地库的所有内容推送到远程库上
git push <远程主机名> <本地分支名>:<远程分支名>
# 推送操作,如果省略远程分支名,则表示将本地分支推送与之存在”追踪关系”的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
git push origin master
# 将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了
git push -u origin master
#不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机
git push --all origin
# 如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用--force选项,这样做会覆盖掉远程上比你新的版本。
git push --force origin master
1.10 tag操作
# 展示标签
git tag
# 打标签和注释
git tag -a v0.1.2 -m "0.1.2版本"
# 给指定的commit打标签
git tag -a v0.1.1 9fbc3d0
# git push 操作不会将tag上传到服务器,需要单独上传,将v0.1.2标签提交到git服务器
git push origin v0.1.2
# 将本地所有标签一次性提交到git服务器
git push origin --tags
# 删除标签
git tag -d v0.1.2
# 删除远程的tag
git push origin --delete tag <tagname>
2. 其他一些汇总
2.1 github上初始一个项目
创建一个新的仓库,并上传到github
echo "# ceshi" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:archer-wong/ceshi.git
git push -u origin master
使用一个已有的仓库,并上传到github
git remote add origin git@github.com:archer-wong/ceshi.git
git push -u origin master
2.2 重命名远程分支(先删除远程分支,重命名本地分支,最后提交一个新的远程分支)
git push --delete origin devel
git branch -m devel develop
git push origin develop
2.3 cherry-pick中出现冲突解决方法
git status #查看有哪些冲突
vim xxx.php #手动解决冲突的文件
git add xxx.php
git commit -m "xxx"
git push origin develop
2.4 git中window和Linux换行符问题
不同的操作系统中使用的换行符是不同的,参考如下
Windows/Dos CRLF \r\n
Linux/Unix LF \n
MacOS CR \r
当我们使用git管理版本的时候,如果有人在windows上开发,有人在linux上开发者,很可能你就会遇到行尾结束符问题,可以参考设置以下两项
1> 设置autocrlf
提交时转换为LF,拉取时转换为CRLF(windows上设置)
git config --global core.autocrlf true
提交时转换为LF,拉取时不转换(linux上设置)
git config --global core.autocrlf input
这样可以保证版本库里面是LF换行符,linux上使用LF, windows上迁出后使用的是CRLF
- 开启safecrlf检查
Git提供了一个换行符检查功能(core.safecrlf),可以在提交时检查文件是否混用了不同风格的换行符。这个功能的选项如下:
- false - 不做任何检查
- warn - 在提交时检查并警告
- true - 在提交时检查,如果发现混用则拒绝提交
建议使用最严格的 true 选项。core.autocrlf
git config --global core.safecrlf true
2.5 .gitignore文件
.gitignore 配置文件用于配置不需要加入版本管理的文件
1、语法:
所有空行或者以 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配。
匹配模式可以以(/)开头防止递归。
匹配模式可以以(/)结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。
星号(*)匹配零个或多个任意字符;
[abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
问号(?)只匹配一个任意字符;
如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。
使用两个星号(*) 表示匹配任意中间目录,比如a/**/z 可以匹配 a/z, a/b/z 或 a/b/c/z等。
2、示例:
# 忽略 .a 文件
*.a
# 否定忽略 lib.a, 尽管已经在前面忽略了 .a 文件
!lib.a
# 仅在当前目录下忽略 TODO 文件, 但不包括子目录下的 subdir/TODO
/TODO
# 忽略 build/ 文件夹下的所有文件
build/
# 忽略 doc/notes.txt, 不包括 doc/server/arch.txt
doc/*.txt
# 忽略所有的 .pdf 文件 在 doc/ directory 下的
doc/**/*.pdf
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,你可以在https://github.com/github/gitignore 找到它.
3、.gitignore不生效问题
如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
2.6 平时采用的git管理模式
平时开发流程,每一个feature新建一个分支,然后在该分支开发完后,进行rebase操作,然后切换到主分支进行merge操作
git branch -b feature-xxx //在master分支新建并切换分支,在feature-xxx完成代码,然后add,commit
git checkout master
git pull origin master
git checkout feature-xxx
git rebase master
git checkout master
git merge --no-ff feature-xxx
git push origin master
rebase过程中产生冲突的解决方法
查看冲突的文件
git diff
然后手动解决冲突
git status
将冲突文件放入暂存区
git add vendor/composer/autoload_real.php
继续rebase操作
git rebase --continue
2.7 分支合并的总结
参考地址:https://yanhaijing.com/git/2017/07/14/four-method-for-git-merge/
在git中合并分支有三种方法,分别是merge,rebase,cherry-pick,而其中merge又有三种区别fast-forward,no-ff,squash
2.7.1 merge操作
1、fast-forward
如果待合并的分支在当前分支的下游,也就是说没有分叉时,会发生快速合并,从test分支切换到master分支,然后合并test分支
git checkout master
git merge test
这种方法相当于直接把master分支移动到test分支所在的地方,并移动HEAD指针
2、no-ff
如果我们不想要快速合并,那么我们可以强制指定为非快速合并,只需加上--no-ff参数
git checkout master
git merge –no-ff test
这种合并方法会在master分支上新建一个提交节点,从而完成合并
3、squash
svn的在合并分支时采用的就是这种方式,squash会在当前分支新建一个提交节点
squash和no-ff非常类似,区别只有一点不会保留对合入分支的引用
git checkout master
git merge –squash test
2.7.2 rebase操作
当要合并两个分叉的分支时,merge的方式是将待合入分支和当前分支不同的部分,在当前分支新建节点,如下图所示
rebase与merge不同,rebase会将合入分支上超前的节点在待合入分支上重新提交一遍,如下图,B1 B2会变为B1’ B2’,看起来会变成线性历史
2.7.3 cherry-pick
你想把哪个节点merge过来就把哪个节点merge过来,其合入的不是分支而是提交节点
git命令行操作详解的更多相关文章
- memcached命令行操作详解,命令选项的详细解释
连接到memcached命令行下: telnet 127.0.0.1 11211 1.set / add / replace : 格式:<command> <key> < ...
- windows下使用TortoiseGit代替Git命令行操作
windows下使用TortoiseGit代替Git命令行操作 大家在使用svn的时候,都非常喜欢使用小乌龟,也就是TortoiseSVN:那么git也有小乌龟版本,即TortoiseGit. 1.安 ...
- VLC命令行参数详解
VLC命令行参数详解 2012-11-29 14:00 6859人阅读 评论(0) 收藏 举报 Usage: vlc [options] [stream] ...You can specify mul ...
- 3.Git 命令行操作
1.Git 命令行操作(本地库操作): 1.1. 创建本地库(本地库初始化): 第一步:首先在D盘建了个名为git空文件夹,命令行中cd到这个文件夹: 第二步:通过git init命令把这个目录变成G ...
- git 命令行操作(之前整理在有道的笔记)
1. 常用命令 切换分支 git checkout [branch_name] 检出分支 git clone [git_URL] 更新分支 git pull origin [branch_name] ...
- GIT → 05:Git命令行操作
5.1 打开命令行窗口 安装Git后,在资源管理器的空白处,单击鼠标右键打开窗口,点击 Git Bash Here ,打开Git命令行窗口,在窗口中可直接使用Linux命令操作: 5.2 初始化Git ...
- Kubernetes 实践指南之Kubernetes 的命令行工具详解
kubectl作为客户端CLI工具,可以让用户通过命令行的方式对Kubernetes集群进行管理.本节内容将对kubectl的子命令和用法进行详细描述. 一.kubectl 用法概述 kubectl语 ...
- git 命令行操作
Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目 这里说一下在命令行对git进行操作 git init [在本地初始化一个git库] //当你的git服务器里面已经有文 ...
- git命令行操作
从本地上传代码到仓库(假设已经建好仓库): 1.初始化: git init 2.将所有文件加入缓存区: git add * 3.提交当前工作空间的修改内容: git commit -m 'commit ...
随机推荐
- 数组k平移三种方法(java)
上代码,本文用了三种方法实现,时间复杂度不一样,空间复杂度都是o(1): public class ArrayKMove { /** * 问题:数组的向左k平移,k小于数组长度 * @param ar ...
- python3 爬虫笔记(一)beautiful_soup
很多人学习python,爬虫入门,在python爬虫中,有很多库供开发使用. 用于请求的urllib(python3)和request基本库,xpath,beautiful soup,pyquery这 ...
- COGS 449. 网络病毒
★★ 输入文件:virus.in 输出文件:virus.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 公元2008年10月31日星期五,笃志者所在的整个机房由 ...
- python IDE-pycharm在virtualenv里安装软件
1 windows命令行,进入venv下的scripts目录,执行activate.bat进入虚拟环境 2 以selenium安装为例,输入pip install selenium回车开始安装 3 ...
- url网址解析的好帮手
接下来进入node的重点,也就是介绍nodejs主要api的功能和如果使用,由于nodejs逐渐能满足这种高并发和大规模的场景.他才被更多的公司所采用 无论什么资源,一定要有明确的地址才有意义,在互联 ...
- 2017.9.30 Java中引用类型变量的创建及使用&循环的高级
今日内容介绍 1.引用类型变量的创建及使用 2.流程控制语句之选择语句 3.流程控制语句之循环语句 4.循环高级 ###01创建引用类型变量公式 * A: 创建引用类型变量公式 ...
- OOM导致的备库raylog损坏导致主从复制异常
问题发现告警数据库出现复制中断,延迟超过100秒 问题排查复制信息检查,通过’show slave status\G’命令可以查看复制线程详细的工作状态,对于判断复制中断的原因有一些指导性意义.当时的 ...
- 模拟ie9的placeholder
ie9 的input框没有placeholder属性 啧啧啧~~~ 所以就用span标签来模拟一下 先判断浏览器类型 if(navigator.useAgent.indexOf("MSIE ...
- 线段树的应用xx中学模拟lites
跟昨天那个自己写的,没有按照模板来的一看风格就不相类似,今天模拟赛的时候就是用的我的那个自己YY的代码,才拿了10分.个人认为关键的问题应该在于对于数据的处理太过繁琐了,所以回来之后,就拿了大佬的程序 ...
- 【杂题总汇】UVa-1627 Team them up!
[UVa-1627] Team them up! 借鉴了一下hahalidaxin的博客……了解了思路,但是莫名Wa了:最后再找了一篇dwtfukgv的博客才做出来