GIT 使用
配置
git config --global user.name "Your Name" git config --global user.email "email@example.com"
生成非对称钥匙
#创建SSH key(主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件): ssh-keygen -t rsa -C "youremail@example.com" #登陆GitHub,“Account settings”——“SSH Keys” #点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。
输出
Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in id_rsa.gitee. Your public key has been saved in id_rsa.gitee.pub. The key fingerprint is: SHA256:lmjU8A4k+r6liYJmENBPM/7Frx3XDg98VeWvIQ9dLyw xxxxx@xxxxx.com The key's randomart image is: +---[RSA 2048]----+ | . . o o| |. ..+o + ..| |. .+ oo.o +| |. .o. +o. o .+| | . ..o.S. .E.=.o| |. . ... o ==o+ | |o . . o o *o | |oo . = . . o | |o.. + | +----[SHA256]-----+
查看相关id_rsa.pub后缀的钥匙后,复制cat输出,填写到对应代码存储库服务的ssh设置中
如果是新的工程项目
mkdir learngit
cd learngit
git init
如果是需要继续的项目
git clone xxxxxxxxxxxx就行
如果需要拉取指定分支,比如tag是dev_jk
git clone -b dev_jk http://10.1.1.11/service/tmall-service.git
如果不需要历史库,可以使用浅克隆,shallow clone
由于clone的内容非常少,因此速度就大大提升了。查看git log
也只有最后一次递交记录而已。
# 浅克隆经常在一些大型仓库中很有用——不用花费大量时间去clone一个完整的仓库,仅仅checkout出来某个分支(如master)的最新N次递交:
git clone --depth 1 https://github.com/openwrt/openwrt.git
关联远程库
git remote add origin git@github.com:******/#####.git
添加至仓库(又名版本库)
git add . git commit -m "wrote update feature comment"
git add在提交你修改的文件之前,你需要把它们添加到暂存区。如果该文件是新创建的,你可以执行将该文件添加到暂存区 git add . //Git会递归地将你执行命令时所在的目录中的所有文件添加上去,所以如果你将当前的工作目录作为参数,它就会追踪那儿的所有文件 git add -u //使用-u参数调用了git add命令,会将本地有改动(包括删除和修改)的已经追踪的文件标记到暂存区中。 git add -A //使用-A参数会将添加所有改动的已跟踪文件和未跟踪文件。
查看当前提交状态
# 查看当前提交状态
git status
查看历史
# 每个提交在一行内显示
git log --oneline 或者 git log --pretty=oneline
# 在所有提交日志中搜索包含「homepage」的提交
git log --all --grep='homepage'
# 获取某人的提交日志
git log --author="Maxence"
参考日志 git reflog
git reflog <subcommand> <options>
# Reference logs(参考日志),或者叫做"reflogs",记录了分支的tips(提示信息?)或者其他参考在本地仓库被更新的时间
git log是显示当前的HEAD和它的祖先的,递归是沿着当前指针的父亲,父亲的父亲,…,这样的原则。
git reflog根本不遍历HEAD的祖先。它是HEAD所指向的一个顺序的提交列表:它的undo历史。reflog并不是repo(仓库)的一部分,它单独存储,而且不包含在pushes,fetches或者clones里面,它纯属是本地的。
添加推送
git push -u origin master(第二次就不用-u了) 推送到其他分支(并命名) git push origin dev
查看远程库信息
git remote #详细 git remote -v
查看当前所处tag
git log --graph --pretty=format:'%h %d %s (%cr) <%an>' --abbrev-commit --date=relative git branch -vv
git 删除远程分支文件
git删除远程分支包括两种情况:
(1)仅仅删除远程分支文件,不删除本地的文件;
(2)删除远程分支文件的同时,删除本地的文件。
1. 仅仅删除远程分支文件,不删除本地文件
删除远程文件filename
git rm --cached filename git commit -m "delete remote file filename " git push -u origin master(此处是当前分支的名字)
删除远程文件夹directoryname
git rm -r --cached directoryname git commit -m "delete remote directory directoryname " git push -u origin master(此处是当前分支的名字)
2. 删除本地文件与远程分支文件
删除文件filename
git rm filename git commit -m "delete file filename " git push -u origin master(此处是当前分支的名字)
删除文件夹directoryname
git rm -r directoryname git commit -m "delete directory directoryname " git push -u origin master(此处是当前分支的名字)
版本回滚
#回滚上一个版本, git reset --hard HEAD^
#利用commit的id 回滚 git reset --hard 3628164
#HEAD //表示当前版本
#HEAD^ 和 git reset // 上一个版本
#HEAD^^ //上上一个版本
#HEAD~10 //前10个版本
分支管理
查看分支:git branch -a 创建分支:git branch <name>
删除本地分支 git branch -d <name>
删除远程分支 git push origin --delete <name> 切换到其他分支:git checkout <name> 回到该分支最新状态 git checkout master 创建+切换分支:git checkout -b <name> 合并某分支到当前分支:git merge <name>
本地仓库乱了,需要对齐到远程
git fetch origin
git checkout master
git reset --hard origin/master
查看我的分支和 master 的不同
git diff master..my-branch
修改上一次的提交
# 编辑上次提交 git commit --amend -m "更好的提交日志"
.gitgnore 使git忽略掉目标文件
同步代码
最常见的命令如取回origin
主机的master
分支:
git fetch origin master
或者
git pull origin master
# git pull <远程主机名> <远程分支名>:<本地分支名>
同步代码最好加上--rebase
git pull --rebase
# git pull = git fetch + git merge FETCH_HEAD
所以,默认情况下,git pull就是先fetch,然后执行merge 操作,如果加–rebase 参数,就是使用git rebase 代替git merge。
merge 和 rebase
merge 是合并的意思,rebase是复位基底的意思。
现在我们有这样的两个分支,test和master,提交如下:
D---E test
/
A---B---C---F master
在master执行git merge test
,然后会得到如下结果:
D--------E
/ \
A---B---C---F----G test, master 得到的G节点是融合了E节点的新feature部分
在master执行git rebase test,然后得到如下结果:
A---B---D---E---C'---F' test, master
解决冲突
在我们操作过程中。merge 操作遇到冲突的时候,当前merge不能继续进行下去。手动修改冲突内容后,add 修改,commit 就可以了。
错误add
git rm xx.file (这是相对add的反操作)