git是一个很神奇的工具,是由Linux的发起者linus用c语言编写的… 最常用的其实只有十几个命令,其他的可以等到真正的团队合作的时候去复习一下。 在这里记录一下常用命令,想要学习git推荐廖雪峰的Git教程
git #检测是否已安装git
sudo apt install git
第一次在新电脑创建项目,需要添加res公钥到github
cd ~/.ssh/
ssh-keygen -t rsa -C "email@email.com" #双引号中是github的邮箱
将此目录下生成的rsa公钥复制到github
本地创建新的项目
git init
git remote add origin git@github.com:xxx/xxx.git
git pull git@github.com:xxx/xxx.git
git push -u origin master
git pull
设置用户和邮箱
git config --global user.name "YIFEI"
git config --global user.email "xxx@xx.com"
根据远程test_dev分支创建本地test_dev2分支
git fetch origin test_dev:test_dev2
该方式会在本地新建分支x,但是不会自动切换到该本地分支x,
需要git checkout test_dev2 手动切换过去。
采用此种方法建立的本地分支不会和远程分支建立映射关系。
git pull origin master #从远程master分支拉取回来,合并分支到当前分支
git push origin test_dev #push到远程test_dev分支
git fetch 相当于是从远程获取最新到本地,不会自动merge,如下指令:
git fetch orgin master //将远程仓库的master分支下载到本地当前branch中
git log -p master origin/master //比较本地的master分支和origin/master分支的差别
git merge origin/master //将origin/master合并到当前分支
ssh-keygen -t rsa -C "你的github邮箱" #生成公私钥
然后将/users/xxx/.ssh下的id_rsa.pub复制,添加到github
ssh-add #将密钥添加到ssh-agent高速缓存中
SSH -T git@github.com #测试密钥是否设置成功
创建版本库
mkdir mygit
cd mygit
git init
ll #可以发现多了一个.git目录
添加到暂存区
git add readme.txt
git add . #提交新文件和修改的文件,不提交被删除的文件
git add -u #提交修改的和被删除的文件,不提交新文件
git add -A #提交所有的变化
ps:git 2.0中git add .改成提交所有变化了
提交到仓库
git commit -m "this is a readme file"
-m message
查看工作状态
git status
查看修改内容
git diff
切换版本
git reset --hard commit_id
HEAD是当前版本
查看提交历史
git log
git reflog #查看命令历史,可以用于重返未来
git log --graph #查看分支合并图
git log --graph --pretty=oneline --abbrev-commit #查看详细log
终极版:
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 lg #查看效果
撤销工作区的修改
git checkout -- readme.txt
工作区的修改会被还原,还原成暂存区的内容
还原暂存区的内容(用HEAD版本的内容)
git reset HEAD readme.txt
从版本库中删除文件
git rm test.txt
git commit -m "remove test.txt"
关联远程库
git remote add origin git@github.com:xxxxx/xxxxx
origin是远程库的名字
将本地库推送到远程库
git push -u origin master
从本地的master推送到远程的origin
第一次clone或push可能会有ssh警告
第一次需要添加-u参数,以后可以直接
git push origin master
git push origin new_branch #推送new_branch分支到远程库
克隆远程库
cd moumulu
git clone git@github.com:xxxx/xxxx
将远程库合并到本地
git pull
如果提示no tracking information,说明本地分支与远程分支连接没有创建,使用:
git branch --set-upstream-to <branchname> origin/<branchname>
查看远程库信息
git remote
git remote -v
删除远程库文件或目录
git rm -r --cached path
git commit -m "delete remote file"
git push
查看当前分支
git branch
创建分支
git checkout -b newbranch
-b 表示创建并切换,相当于
git branch newbranch
git checkout newbranch
根据远程分支创建本地分支
git checkout -b abc origin/abc #abc为分支名(注意这里要创建相同的名字,不然推送的时候会失败)
推送本地分支到远程
git push origin localbranch:remotebranch
修改分支名
git branch -m old_branch new_branch
切换分支
git checkout branchname
合并分支到当前分支
git checkout master #切换到master分支
git merge branchname #将branchname合并到当前分支
建议用:
git merge --no-ff -m "blabla..." branchname
这样不使用快速合并,可以在log里保留记录
删除分支
git branch -d branchname
git branch #查看
使用rebase修改“基版本”(rebase命令会改变历史,建议只在个人分支使用)
# 当基于master版本创建新分支b1并进行了修改后,master版本已经发生了变化,此时使用rebase将b1的基版本改为master的最新版本。
git checkout b1
git rebase master
# 如果发生冲突,手动解决后需要执行 git rebase --continue
使用rebase合并多个提交
git rebase -i [startpoint] [endpoint]
# -i 的意思是 --interactive,即弹出交互式的界面让用户编辑完成合并操作
# startpoint 和 endpoint 指定了一个左开右闭区间,startpoint会被保留
# 如果不指定endpoint,则该区间的终点endpoint默认是当前分支HEAD所指向的提交
# 也可用该命令合并最近n个提交git rebase -i HEAD~n
# 之后弹出窗口让修改合并方式
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
# 一般使用如下方式将后面提交都合并到第一个提交上。
pick 85697ee This is first commit.
squash ee461c1 This is second commit.
squash 326e415 This is third commit.
# 此时处在一个临时分支上,可创建新分支
git checkout -b newbranch
# 若发生冲突可解决冲突后,使用如下命令继续或终止rebase操作。
git rebase --continue
git rebase --abort
使用cherry-pick将提交应用到其他分支
git cherry-pick hash #将某次提交应用到当前分支
git cherry-pick hasha hashb hashc #将多次提交应用到当前分支
git cherry-pick hasha..hashb #将hasha之后,直到hashb之间的提交应用到当前分支(不包含hasha)
git cherry-pick hasha^..hashb #将hasha到hashb之间的提交应用到当前分支(包含hasha)
参数
-e,--edit #打开外部编辑器,编辑提交信息。
-n,--no-commit #只更新工作区和暂存区,不产生新的提交。
-x #在提交信息的末尾追加一行(cherry picked from commit ...),方便以后查到这个提交是如何产生的。
-s,--signoff #在提交信息的末尾追加一行操作者的签名,表示是谁进行了这个操作。
处理冲突
# 用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 Cherry pick 过程继续执行。
git cherry-pick --continue
# 发生代码冲突后,放弃合并,回到操作前的样子。
git cherry-pick --abort
发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。
git cherry-pick --quit
git submodule add https://xxxxxxx/xxx.git pathname
克隆项目和submodule
git clone https://xxx/xxx.git
git submodule init
git submodule update
或用一句搞定
git clone --recursive https://xxx/xxx.git
查看标签
git tag
添加标签
git checkout branchname
git tag <tagname>
对某次提交打标签
git tag v0.9 a3k9359
git tag -a v0.1 -m "version v0.1 released" a3k9359
-a 指定标签名
-m 添加注释
查看标签信息
git show <tagname>
删除标签
git tag -d v0.1
推送某标签到远程
git push origin v1.0
删除远程标签
git tag -d v0.2 #先删除本地标签
git push origin :refs/tags/v0.2 #删除远程标签
忽略特殊文件
根目录下新建 .gitignore 文件,写入文件名或.exe等类型
git add -f a.exe #强制添加到git
git check-ignore -v a.exe #检查规则
配置文件
.git/config #配置文件存放地
有时候因为本地修改的太乱了,想直接用远程库替换本地的库可以使用下面两条命令
git fetch --all #用远程库还原本地版本库
git reset --hard origin/master #用origin/master版本库内容还原暂存库
当改乱了工作区内容时,想丢弃工作区的修改 git checkout – file
当改乱了文件,并且添加到了暂存区,先git reset HEAD ,再用git checkout – file
当改乱了之后,并且提交到了本地版本库,使用git reset –hard 版本号 可以在各个版本之间穿梭
git中的check out,主要有以下两个功能: 1.创建、切换分支。 2.用暂存区或版本区的内容恢复到工作区。 具体使用方法可查看蚂蚁部落教程。
不小心提交了没用的文件到远程库
git rm -r --cached test/a.txt // 删除test文件夹下的a.txt文件,加入到删除缓存中
git commit -m '删除test文件夹下的a.txt文件' // 执行删除缓存,提交文字为“删除test文件夹下的a.txt文件”
git rm -r --cached test // 删除test文件夹,加入到删除缓存中
git commit -m '删除test文件夹' // 执行删除缓存,提交文字为“删除test文件夹”
git push // 推送操作到远程仓库
每次add之前git status查看修改了哪些文件,每次只add修改过的文件,可以防止提交了无用的文件
需要回退版本
git log 或者 git reflog
git reset --hard <commit_id> 或者 git reset --hard HEAD@{x}
只恢复某个文件
git checkout b284c80c2648f886267ea76348ca7981db8cc test/test.txt
git checkout commit filepath
暂时储藏当前的修改
有时候你改了一些文件,但此时想要切换到别的分支上工作,此时是无法切换成功的。
这时候就需要下面这条命令:
git stash #将当前修改暂时储藏起来
git stash pop 或者 git stash apply 将上次的储藏恢复
或者也可以这样:
$ git stash list
stash@{0}: WIP on master: 049d078 added the index file
stash@{1}: WIP on master: c264051 Revert "added file_size"
stash@{2}: WIP on master: 21d80a5 added number to log
$ git stash apply stash@{2}
git diff
$ git diff #(1)
$ git diff --cached #(2)
$ git diff HEAD #(3)
1.工作树中的更改尚未分段进行下一次提交。
2.索引和最后一次提交之间的变化; 查看已经git add ,但没有git commit 的改动。
3.自上次提交以来工作树中的更改;如果运行“git commit -a”,查看将会提交什么。
抛弃所有改变,同步到最新远程库
git强制覆盖本地代码:
git fetch --all
git reset --hard origin/master
git pull
或(慎用)
git fetch --all && git reset --hard origin/master && git pull
欢迎与我分享你的看法。 转载请注明出处:http://taowusheng.cn/