git 常用命令.md
git tag ?
配置
删除
vim ~/.gitconfig
# 删除 origin 的 参数
[remote "origin"]
git 修改commit 的注释,最新的一次提交,push过了不行
git commit --amend
git配置(提交commit时的签名)
下面的是全局设置,单独的话就不带 –global 选项
git config --global core.editor vim #设置默认编辑器
git config -l 所有的配置参数
git config --global user.name "name"
git config --global user.email "email"
ssh与https互换
1.修改命令
git remote set-url origin [url]
我这里使用 git remote set-url origin [url]命令,直接修改远程仓库为https的地址
2.先删后加
git remote rm origin
git remote add origin [url]
3.直接修改config文件
以上进行git操作的时候,每次都需要密码,所以可以配置免密
添加内容
https://{username}:{passwd}@github.com
忽略本地文件修改
在使用git时,对于本地配置文件,肯定不必提交,但总是在’git status’中看到文件修改
git update-index --assume-unchanged build/conf/a.conf
要恢复的话,方法如下:
git update-index --no-assume-unchanged build/conf/a.conf
如果想知道当前被忽略修改的本地文件列表,使用如下命令:
git ls-files -v | grep -e "^[hsmrck]"
配置多个远程仓库
输入的时候不需要输入 < 和 >
# 添加一个新远程仓库
# 其中,name 表示你要给这个远程库起的名字,url 表示这个库的地址
git remote add <name> <url>
# 提交的时候
git push <name> <branch>
git push <name> <local branch>:<remote branch>
git pull <name> <branch>
git pull <name> <remote branch>:<local branch>
# 其中,name 表示你在上一步给它起的名字,branch 表示某一个分支
# 删除远程分支
# 一种方式是,可以直接在 github 网页上操作
# 另一种方式是:
git push <name> :<branch> #(注意冒号前的空格)
# 配置远程仓库
git remote add origin https://url
# 再添加一个远程仓库,跟origin一样
git remote set-url --add origin https://url
# 注意这里多次添加需要用
git remote set-url --add
# 不然会报错:
fatal: remote origin already exists.
# 或者改名
git remote add otherOrigin https://url
# 一次提交到所有远程仓库
git push --all
# 注意
git pull 是 git pull (from) origin (to) master
git push 是 git push (to) origin (from) master
基本操作
显示图形界面,显示项目历史
gitk/git gui
初始化一个新仓库
git init
url 路径(可以是本地路径,即目录路径)
git clone url
将更新内容添加到索引中
git add file1 file2
添加全部
git add .
获得当前项目的一个状况
git status
编写.ignore文件
提交一个版本
git commit
会自动把所有内容有修改的文件(不包括新创建的文件),都添加到索引中,并且同时把他们提交
git commit -a
直接提交一个版本
git commit -m "info"
推送到远程仓库
git push
git remote
查看有哪些远程仓库
git remote
查看远程仓库的详细信息,列出其远程url
git remote -v
修改远程仓库地址
git remote set-url origin "https://..."
添加远程仓库
git remote add test url
添加或者修改远程仓库地址
git config remote.origin.url "https://..."
删除远程仓库配置
git remote rm origin
添加和删除 global 的 remote.origin.url
git remote --global set-url origin "https://..."
git config --global remote.origin.url "https://..."
同时推送到多个版本库【既push到github上,又push到开源中国的Git@OSC上】
首先,先增加第一个地址 git remote add origin <url1>
然后增加第二个地址 git remote set-url --add origin <url2>
增加第三个地址 git remote set-url --add origin <url3>
git fetch
git fetch 相当于是从远程获取最新到本地,不会自动merge,
将远程仓库的master分支下载到本地当前branch中
git fetch origin master
比较本地的master分支和origin/master分支的差别
git log -p master ..origin/master
进行合并
git merge origin/master
也可以用以下指令:
从远程仓库master分支获取最新,在本地建立tmp分支
git fetch origin master:tmp
將當前分支和tmp進行對比
git diff tmp
合并tmp分支到当前分支
git merge tmp
删除temp
git branch -d temp
git pull
相当于是从远程获取最新版本并merge到本地
下面这句,pull 远程仓库origin的master分支
git pull origin master
从远程仓库origin 拉取tt分支,到本地的分支名为tt2
git pull origin tt:tt2
git diff
对比工作区(未 git add)和暂存区(git add 之后)
git diff
对比暂存区(git add 之后)和版本库
git diff --cached
git diff --cached HEAD
对比工作区(未 git add)和版本库
git diff HEAD
显示两个分支间的差异
git diff master..test
显示master,test的共有父分支和test之间的差异
git diff master...test
当前分支与test分支的差别,也可比较某一文件或目录
git diff test
当前工作目录(分支)lib目录与上次提交的差别
git diff HEAD -- ./lib
统计当前哪些文件被改动,有几行改动
git diff --stat
git log
git log 参数 (有各种参数,功能强大)
显示每个提交的被修改文件,以及这些文件分别添加删除了几行
git log --stat
格式化输出
git log --pretty=oneline
git log --pretty=short (medium,full,fuller,email,raw) 自定义 --pretty=format
可视化提交图
git log --graph
git push
不带任何参数的git push,默认只推送当前分支,这叫做simple方式。
此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。
Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。
强制push
git push -f
提交指定仓库,把本地local分支提交到test仓库的master分支
git push test local:master
将当前分支推送到origin主机的对应分支
git push origin
建立本地关联远程分支
git branch --set-upstream-to=origin/<branch> release
建立本地关联远程分支
git push -u origin my_branch
git push --set-upstream origin client_dev
当有多个远程主机仓库时,下面命令将本地的master分支推送到origin主机,
同时指定origin为默认主机,后面就可以不加任何参数使用git push了
git push -u origin master
使用matching方式,可以在命令行输入:
git config --global push.default matching
使用simple方式,可以在命令行输入:
git config --global push.default simple
可以不加 --global
git branch
新建分支
git branch branch_name
获取当前仓库所有分支列表
git branch
获取远程所有分支列表
git branch a
切换分支
git checkout branch_name
创建并切换分支
git checkout -b branchName
合并分支
git merge branch_name
删除分支(只能删除被当前分支合并的分支)
git branch -d branch_name
强制删除分支
git branch -D branch_name
手动建立追踪关系
git branch --set-upstream master origin/next
删除远程分支
git branch -r -d origin/branch-name
git push origin :branch-name
撤销回滚操作
文件被修改了,但未执行git add操作(working tree内撤销)
git checkout fileName
git checkout .
同时对多个文件执行了git add操作,但本次只想提交其中一部分文件
git reset HEAD <filename>
文件执行了git add操作,但想撤销对其的修改(index内回滚)
# 取消暂存
git reset HEAD fileName
git reset 文件名
# 撤销修改
git checkout fileName
修改的文件已被git commit,但想再次修改不再产生新的Commit
# 修改最后一次提交
git add sample.txt
git commit --amend -m"说明"
撤销指定文件到指定版本
# 查看指定文件的历史版本
git log <filename>
# 回滚到指定commitID
git checkout <commitID> <filename>
删除最后一次远程提交
git revert HEAD
git push origin master
删除最后一次远程提交,使用reset
git reset --hard HEAD^
git push origin master -f
回滚某次提交
# 找到要回滚的commitID
git log
git revert commitID
git reset
参考: link
HEAD: 这是当前分支版本顶端的别名,也就是在当前分支你最近的一个提交
Working Copy/Working Tree: 代表你正在工作的那个(区域)
Index: index也被称为staging area,是指一整套即将被下一个提交的文件集合。他也是将成为HEAD的父亲的那个commit. Stage 或 Cache,即缓冲器,git add的区域
--soft: 保留 Working Tree、Index,HEAD变化(repository 中的档案內容变成与 reset 目标结点一致)
使用情景
1. 当我们想合并「当前结点」与「reset目标结点」间不具太大意义的 commit 纪录(可能是阶段性地频繁提交)时,可以考虑使用 Soft Reset 来让 commit 演进线图较为清晰。
--mixed: 默认,保留Working Tree,Index 和HEAd(Repository文件内容)会变更与目标节点一致。
使用情景
1. 一样可以达到合并commit节点的效果
2. 移除所有Index中准备要提交的档案(staged files)可执行 git reset HEAD 来unstage所有已列入Index的待提交档案
--keep: 使用命令时,需在新提交之后,可以返回以前的版本并去除后面的提交,三个Working Tree、Index 和HEAd(Repository文件内容)会变更与目标节点一致。(pycharm中smart reset后会把本地变动存在stash中)
--hard: 不保留,重置HEAD、Working Tree、Index,(Repository档案内容)会恢复到目标节点一致
使用情景
1. 放弃目前本地的所有变更,执行 git reset --hard HEAD 来强制恢复资料内容及状态;
2. 或者真的想放弃目标节点之后的所有变更
列出所有记录,复原操作依靠此命令(当想回到原来的状态时)
git reflog
回退到上一个版本(上一个操作),会把最后一次commit后又更改的代码丢弃
回滚pull
git reset --hard ORIG_HEAD
在没有commit的情况下回滚pull,可以保留之前没有commit的那些更改
git reset --merge ORIG_HEAD
回到之前的某个版本,目标版本之后的提交全部消失,
git reset --hard HEAD
git reset --hard HEAD~2
git reset --hard 版本号
git reset --hard HEAD@{7}
git revote
指定要反做的提交版本号,解决冲突,commit即可
git revert -n 版本号
丢弃最近的三个commit,把状态恢复到最近的第四个commit,并且提交一个新的commit来记录这次改变。
git revert HEAD~3
丢弃从最近的第五个commit(包含)到第二个(不包含),但是不自动生成commit,这个revert仅仅修改working tree和index。
git revert -n master~5..master~2:
git stash
暂存未跟踪或忽略的文件
默认情况下,git stash会缓存下列文件:
添加到暂存区的修改(staged changes)
Git跟踪的但并未添加到暂存区的修改(unstaged changes)
但不会缓存一下文件:
在工作目录中新的文件(untracked files)
被忽略的文件(ignored files
保存当前的修改,恢复到当前版本修改前的状态
git stash
给每个stash加一个message,用于记录版本,使用git stash save取代git stash命令。
git stash save "test-cmd-stash"
查看现有stash
git stash list
将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝
git stash apply命令时可以通过名字指定使用哪个stash,默认使用最近的stash(即stash@{0})
git stash apply
将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下
git stash pop
移除stash,后面可以跟着stash名字
git stash drop stash@{0}
删除所有缓存的stash
git stash clear
查看指定stash的diff,只有修改的文件统计,后面可以跟着stash名字
git stash show
查看特定stash的全部diff
git stash show -p
从stash创建分支, 检出你储藏工作时的所处的提交,重新应用你的工作,如果成功,将会丢弃储藏。
git stash branch testchanges
.ignore
忽略某些文件
* \# 以'#' 开始的行,被视为注释.
* \# 忽略掉所有文件名是 foo.txt 的文件.
* foo.txt
* \# 忽略所有生成的 html 文件,
* *.html
* \# foo.html是手工维护的,所以例外.
* !foo.html
* \# 忽略所有.o 和 .a文件.
* *.[oa]
git rebase
git rebase过程相比较git merge合并整合得到的结果没有任何区别,但是通过git rebase衍合能产生一个更为整洁的提交历史。
如果观察一个衍合过的分支的历史提交记录,看起来会更清楚:仿佛所有修改都是在一根线上先后完成的,尽管实际上它们原来是同时并行发生的。
一般我们使用衍合的目的,是想要得到一个能在远程分支上干净应用的补丁,比如某个项目你不是维护者,但是想帮点忙,最好使用衍合处理。
先在自己的一个分支进行开发,当准备向主项目提交补丁的时候,根据最新的orgin/master进行一次衍合操作然后再提交,这样维护者就不需要任何整合工作。
实际为:把解决分支补丁同最新主干代码之间的冲突的责任,划转给由提交补丁的人来解决。作为维护项目的人只需要根据你提供的仓库地址做一次快进合并,或者直接采纳你提交的补丁。
衍合的风险,请务必遵循如下准则:
一旦分支中的提交对象发布到公共仓库,就千万不要对该分支进行衍合操作。
#先切换到其他分支
git checkout dev
git rebase master # 将dev上的c2、c5在master分支上做一次衍合处理
# git提示出现了代码冲突,此处为之前埋下的冲突点,处理完毕后
git add readme # 添加冲突处理后的文件
git rebase --continue # 加上--continue参数让rebase继续处理
切回主分支进行merge
移除文件以及取消对文件的跟踪
* git rm tmp.txt 删除文件并取消文件跟踪,如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。
* git rm --cached readme.txt 仅取消文件跟踪
* git rm log/\*.log 可不要反斜杠,删除所有 log/ 目录下扩展名为 .log 的文件
* git rm \*~ 递归删除当前目录及其子目录中所有 ~ 结尾的文件
取消对文件的跟踪还有一个命令:git update-index --assume-unchanged <取消跟踪的文件>
注:该命令只能取消提交到暂存区之前的文件,可以先用git reset <文件名>将暂存区的文件回退到暂存区之前,然后再取消跟踪
认为未改变
git update-index --assume-unchanged config.ini
取消认为未改变
git update-index --no-assume-unchanged config.ini
先查看某行代码由谁写的,在哪个commit中提交的:
git blame file_name
其显示格式为:
commit ID | 代码提交作者 | 提交时间 | 代码位于文件中的行数 | 实际代码
从而获得commit ID,我们就可以知道commit ID了,然后使用命令:git show commitID来看
Git 命令参考手册
参考:
git - 移除文件以及取消对文件的跟踪(git rm –cached readme.txt)
Git 中文参考手册 http://gitref.org/zh/index.html
Git-Book https://git-scm.com/book/zh/v2/
Git-Documentation https://git-scm.com/doc
github提交commit,contributions不统计显示绿色
需要满足一些条件
解决github提交commit,contributions不统计显示绿色的问题
仅供参考