创建
git init 创建空的repository
git add fileName 添加修改的文件,把文件修改添加到暂存区
git commit -m '提交的消息' 把暂存区的所有内容提交到当前分支
git diff commitId1 commitId2 查看两次提交的区别
git diff commitId1:fileName commitId2:fileName 查看两次提交的文件的区别
分支
git branch 查看分支
git branch branchName 创建分支
git checkout branchName 切换到branchName分支
git checkout -b branchName创建并切换到branchName分支
git checkout -b branch-name origin/branch-name 在本地创建和远程分支对应的分支
git merge branchName 把branchName分支合并到当前分支
git branch -d branchName 删除branchName分支,注意不要在branchName分支上做这个操作
git branch --set-upstream branch-name origin/branch-name 建立本地分支和远程分支的关联
git 重新关联远程地址
git remote set-url origin 远程地址
git remote -v
然后再把项目推送过去
git push origin 远程分支
查看修改
git status 查看当前状态,有哪些改动
git diff fileName 查看文件修改的内容
git diff HEAD -- fileName 查看文件fileName工作区和版本库最新版本的区别
查看提交历史
git log 查看提交历史
git log --pretty=oneline 查看log,一行一行地显示
git reflog 查看git操作记录
创建ssh key
ssh-keygen -t rsa -C "youremail@example.com" //生成一对公钥id_rsa.pub 私钥id_rsa
cat ~/.ssh/id_rsa.pub //查看生成的公钥
远程仓库
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快
git remote add origin remoteUrl 远程建了一个空仓库,连接本地到远程(remoteUrl是远程仓库的地址)
git push origin master 把本地分支master 推送到远程
git clone remoteUrl 克隆一个远程已存在的仓库到本地(remoteUrl是远程仓库的地址)
标签管理
git tag tagName 为当前分支打名字为tagName的标签,默认标签是打在最新提交的commit上
git tag tagName commit_id 在commit_id上打tag,适用于忘记打tag的情况
git tag -a tagName -m "blablabla..." 打标签指定标签信息
git show tagName 查看tag的说明
git tag -d tagName 删除本地标签tagName
git push origin tagName 把标签推送到远程
git push origin --tags 推送所有标签到远程
git push origin :refs/tags/tagName 删除远程的标签tagName
git tag --list 查看所有tag
git checkout -b tagBranch tagName 检出tag代码
修改提交message
git commit -m “the commit message" 提交已经被add进来的改动.
git commit --amend 增补提交. 会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消.
git commit -a 会先把所有已经track的文件的改动add进来,然后提交(有点像svn的一次提交,不用先暂存). 对于没有track的文件,还是需要git add一下.
Git rebase
rebase 远程分支
git fetch
可以git fetch [alias]取某一个远程repo,也可以git fetch --all取到全部repo
fetch将会取到所有你本地没有的数据,所有取下来的分支可以被叫做remote branches,它们和本地分支一样(可以看diff,log等,也可以merge到其他分支),但是Git不允许你checkout到它们.
git rebase origin
处理conflicts
git add .
git rebase --continue
git push origin master
rebase 本地分支
--rebase不会产生合并的提交,它会将本地的所有提交临时保存为补丁(patch),放在”.git/rebase”目录中,然后将当前分支更新到最新的分支尖端,最后把保存的补丁应用到分支上.
git rebase branchName
处理conflicts
git add .
git rebase --continue就会继续打余下的补丁.
git push origin master
( git rebase --abort将会终止rebase,当前分支将会回到rebase之前的状态.)
多行注释
git commit -m '
1.one
2.two
'
查看本地分支跟踪的远程分支
git branch -vv
切换跟踪的分支
git remote rm origin
git remote add origin git@git.nonobank.com:lejiangkai/MXD.git
git push -u origin feature5.5.4
stash用法
存档
git stash
查看存档列表
git stash list
恢复存档
git stash apply 存档id
删除存档
git stash drop 存档id
上面的恢复和删除可以用下面的命令合并操作
git stash pop 存档id
合并某个分支的单个文件
git checkout targetbranch
git checkout needMergeBranch -- needMergeFileName
如: 分支test上有一个文件A,你在test1分支上, 此时如果想用test分支上的A文件替换test1分支上的文件的话,可以使用
git checkout test1
然后
git checkout test -- A
远程仓库下载项目
git clone 项目地址
git remote
list, add and delete remote repository aliases.
因为不需要每次都用完整的url,所以Git为每一个remote repo的url都建立一个别名,然后用git remote来管理这个list.
git remote: 列出remote aliases.
如果你clone一个project,Git会自动将原来的url添加进来,别名就叫做:origin.
git remote -v:可以看见每一个别名对应的实际url.
git remote add [alias] [url]: 添加一个新的remote repo.
git remote rm [alias]: 删除一个存在的remote alias.
git remote rename [old-alias] [new-alias]: 重命名.
git remote set-url [alias] [url]:更新url. 可以加上—push和fetch参数,为同一个别名set不同的存取地址.
git clean
git clean是从工作目录中移除没有track的文件.
通常的参数是git clean -df:
-d表示同时移除目录,-f表示force,因为在git的配置文件中, clean.requireForce=true,如果不加-f,clean将会拒绝执行.
git revert
反转撤销提交.只要把出错的提交(commit)的名字(reference)作为参数传给命令就可以了.
git revert HEAD: 撤销最近的一个提交.
git revert会创建一个反向的新提交,可以通过参数-n来告诉Git先不要提交.
git rm
git rm file: 从staging区移除文件,同时也移除出工作目录.
git rm --cached: 从staging区移除文件,但留在工作目录中.
git rm --cached从功能上等同于git reset HEAD,清除了缓存区,但不动工作目录树.
git remote rm origin 删除远程文件
git reset
undo changes and commits.
这里的HEAD关键字指的是当前分支最末梢最新的一个提交.也就是版本库中该分支上的最新版本.
git reset HEAD: unstage files from index and reset pointer to HEAD
这个命令用来把不小心add进去的文件从staged状态取出来,可以单独针对某一个文件操作: git reset HEAD - - filename, 这个- - 也可以不加.
git reset --soft
move HEAD to specific commit reference, index and staging are untouched.
git reset --hard
unstage files AND undo any changes in the working directory since last commit.
使用git reset —hard HEAD进行reset,即上次提交之后,所有staged的改动和工作目录的改动都会消失,还原到上次提交的状态.
这里的HEAD可以被写成任何一次提交的SHA-1.
不带soft和hard参数的git reset,实际上带的是默认参数mixed.
sum:
git reset --mixed id,是将git的HEAD变了(也就是提交记录变了),但文件并没有改变,(也就是working tree并没有改变). 取消了commit和add的内容.
git reset --soft id. 实际上,是git reset –mixed id 后,又做了一次git add.即取消了commit的内容.
git reset --hard id.是将git的HEAD变了,文件也变了.
按改动范围排序如下:
soft (commit) < mixed (commit + add) < hard (commit + add + local working)
git commit
提交已经被add进来的改动.
git commit -m “the commit message"
git commit -a 会先把所有已经track的文件的改动add进来,然后提交(有点像svn的一次提交,不用先暂存). 对于没有track的文件,还是需要git add一下.
git commit --amend 增补提交. 会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消.
git diff
不加参数的git diff:
show diff of unstaged changes.
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容.
若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用:
git diff --cached 命令.
show diff of staged changes.
(Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的).
git diff HEAD
show diff of all staged or unstated changes.
也即比较woking directory和上次提交之间所有的改动.
如果想看自从某个版本之后都改动了什么,可以用:
git diff [version tag]
跟log命令一样,diff也可以加上--stat参数来简化输出.
git diff [branchA] [branchB]可以用来比较两个分支.
它实际上会返回一个由A到B的patch,不是我们想要的结果.
一般我们想要的结果是两个分支分开以后各自的改动都是什么,是由命令:
git diff [branchA]…[branchB]给出的.
实际上它是:git diff $(git merge-base [branchA] [branchB]) [branchB]的结果.
git log
show commit history of a branch.
git log --oneline --number: 每条log只显示一行,显示number条.
git log --oneline --graph:可以图形化地表示出分支合并历史.
git log branchname可以显示特定分支的log.
git log --oneline branch1 ^branch2,可以查看在分支1,却不在分支2中的提交.^表示排除这个分支(Window下可能要给^branch2加上引号).
git log --decorate会显示出tag信息.
git log --author=[author name] 可以指定作者的提交历史.
git log --since --before --until --after 根据提交时间筛选log.
--no-merges可以将merge的commits排除在外.
git log --grep 根据commit信息过滤log: git log --grep=keywords
默认情况下, git log --grep --author是OR的关系,即满足一条即被返回,如果你想让它们是AND的关系,可以加上--all-match的option.
git log -S: filter by introduced diff.
比如: git log -SmethodName (注意S和后面的词之间没有等号分隔).
git log -p: show patch introduced at each commit.
每一个提交都是一个快照(snapshot),Git会把每次提交的diff计算出来,作为一个patch显示给你看.
另一种方法是git show [SHA].
git log --stat: show diffstat of changes introduced at each commit.
同样是用来看改动的相对信息的,--stat比-p的输出更简单一些.
tag操作
$ git tag —— 查看所有的标签
$ git fetch origin tag <tagname> —— 获取远程tag
$ git tag tagName —— 创建轻量级标签
$ git tag -a tagName -m "annotate" —— 创建带注释的标签
$ git checkout tagName —— 切换到某一个标签
$ git tag -d tagName —— 删除某一个标签
$ git push --tags —— 将本地所有tag提交到远程
$ git push origin 标签名—— 提交单个tag
网友评论