一、git安装之后的先配置环境变量
1 git version #查看git的版本
1 git config --global user.name "vhjmhk" #设置全局使用者名称 2 git config --global user.email "vhjmhk@163.com" #设置全局使用者邮箱
cat ~/.gitconfig #可以去家目录的.gitconfig 文件里面查看git的配置
二、git建立仓库
1 git init #初始化一个新的git仓库,默认初始化一个master 的分支
1 git status #查看git仓库状态
提示存在一个没有路径的文件test.sh,git不知道该如何去去处理这个新文件,master隔壁多了一个*,git提示可以使用 git add <file>... 命令来添加这个文件
1 git add test.sh #可以将新文件暂存起来 2 git add -A #一次将目录下所有的文件缓存起来
提示产生了一个新文件test.sh,git提示可以使用 git rm --cached <file>... 来删除缓存区的文件
1 git rm --cached test.sh #可以把缓存区的文件删除
1 git commit -m 'annotation' #将缓存区的文件提交到本地的git仓库中,-m后面跟此次改动的注释
而且*也随之消失
1 cat .git/index #git缓存区的文件保存记录
1 git remote add origin https://github.com/vhjmhk/git-tutorial.git #连接到远端的github仓库(http的方式),默认远端的仓库的名字为origin(约定俗成的名字) 2 git remote -v #查看已连接的远端仓库,我们可以fetch,push来推和拉
1 git push origin master -u #将本地的git仓库里面保存的文件
git push 远端仓库名字 分支
-u是设置成默认的远端仓库,下次要使用的时候,直接使用 git push 即可
有时候需要输入密码,可以做ssh免密校验
1 git push origin feature1 #可以将feature1分支保存到远端的仓库上 2 git push origin feature1:f1 #将feature1分支在远端保存为f1分支 3 git push origin :feature1 #删除远端feature1分支
1 git clone https://github.com/vhjmhk/git-tutorial.git git-clone #从远端的GitHub仓库克隆一个库下来,并设置本地库名为git-clone,不输入库名,默认和远端库名字一样,即git-tutorial
git checkout -- <file>... 将文件还原到上一个状态
修改文件并传到远端仓库
git pull 拉取到远端的代码,将远端库的代码拉取到本地
1 git pull origin master
三、git分支操作
git branch feature1 #建立一个名字是feature1的分支,名字可以自己起
1 git checkout feature1 #切换到feature1的分支里面
1 git checkout -b feature2 #在分支一里面创建一个新的分支,并切换到新的分支里面去
1 git branch -d feature2 #删除一个feature2的分支
因为feature2里面还有新文件没有同步到master里面,所以git不允许我们删除feature2分支,也可以使用 git branch -D feature2 来强制删除,一般在git里面都是比较慎重的选项
git merge feature2 将feature2分支的文件合并到master(当前分支里面)将master的指针指向feature2
四、git合并
1 git log #查看git的操作日志
--oneline 以一行的形式来显示,看起来比较短小
git log --oneline -3 只输出前3行的数据
1 git show 1333068 #查看某一次修改的具体操作
常用的可视化管理log参考:https://stackoverflow.com/questions/1057564/pretty-git-branch-graphs
可视化来管理log
在~/.gitconfig 文件里面加入别称
root@controller01 ~/git-tutorial [master] ± # cat~/.gitconfig [user] name = vhjmhk email = vhjmhk@163.com [alias] lg1 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all lg2 = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n'' %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all lg = !"git lg1" dog = log --all --decorate --oneline --graph
使用 git lg /git lg1
使用 git lg2
使用 git dog
git merge feature1 使用merge的方式来合并的时候,默认使用Fast-forward,不会产生新的分支,前提是没有冲突
可以使用 git merge feature1 --no-ff 会创建一个新的合并节点,在我们合并的同时产生一个新的commit的提交,可以保持原有的开发分支,整个提交链的完整性。会产生一个新的分支,可以看到比较完整的先后路径
git rebase 将feature分支移动到到master分支的最后一次提交,把master最后的操作同步过来,使用rebase可以持续的保持一条竖线,保持整洁,但是会带来一些安全和可跟踪性问题。
注:绝对不要在公共的master分支上使用rebase
merge是一个合并操作,它会将两个分支的修改合并在一起,默认中是不会提交合并中修改的内容的,merge的提交历史会被记录,注重的是提交记录的真实性。
rebase是没有合并操作的,他只是将当前分支的修改复制到目标分支的最后一次提交上面,关注点是开发的过程,rebase的log可以反应这个过程发生了什么
可能使用merge会多一些
分支冲突
可以使用 git mergetool
推荐使用 vimdiff 来进行比较
修改完成后
a.txt.orig 是冲突产生时的临时文件,不需要保存
提交修改并查看log
会产生一些弯曲的线条
实际情况下,其实合并其实还是会使用工具完成的
五、Git回滚和撤销
在提交操作完成之后,突然又不想要这个文件,想回到上一个版本的状态
git reset master^ 将git仓库回归到上一次的版本的状态,回退两次可以使用 git reset master^^ ,回退n次,可以使用 git reset master~n ,可以回到前n次,这属于相对撤销的方式,也可以使用 git reset --hard HEAD^ 功能一样
文件依然存在,但是没有被git托管
git reset 7f0abc2 在后面加版本号可以回到该版本,这属于绝对撤销
常用的选项
--soft 这个模式下的reset,工作目录和暂存区的文件都不会被丢弃,只是移动了commit指针而已
--mixed 这个模式会把暂存区的文件丢弃,但不会动到工作目录的文件
--hard 这个模式下,工作目录以及暂存区的文件都会被丢弃
git reflog 还可以查看之前回退之前的版本(在git log里面看不见),在回退之后,还可以再次回退到回退之前的版本
git revert 可以撤销某次操作,此次操作之前和之后的 commit 和 history 都会保留,并且把这次撤销作为一次最新的提交。
使用 git log 查看日志
产生新的注释
git revert 撤销某次操作,此次操作之前和之后的 commit 和 history 都会保留,并且把这次撤销作为一次最新的提交。git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。相比 git reset,它不会改变现在的提交历史。
在master的分支上应该使用revert,将记录保留下来,可以回溯。
在自己的分支上,可以使用reset来直接回退。
六、ignore和fork
有一些.idea、.settings和.classpath 等无用的硬盘配置文件、编译生成的中间文件、可执行文件、敏感的配置文件和本地不想提交的脚本文件,都不需要同步,需要忽略掉它
先创一个 .gitignore 文件
在里面写入你要忽略文件的条件,而且你要忽略的文件不可以被git托管,如果被托管你需要手动撤销掉
https://www.gitignore.io/ 可以自动生成 .gitignore 文件,输入相应的语言(如:java、python)即可生成相应的,应当忽略的文件
1 git remote add upstream https://github.com/jobbole/awesome-java-cn.git #设置上游仓库 2 git fetch upstream (分支) #将远端的上游仓库的某一个分支的代码拉到本地,默认是master分支
pull = fetch + merge pull会自动合并
1 git branch -r #可以查看远程的分支upstream/master 2 git rebase upstream/master #要更新远端fork仓库的数据,没有自己的修改,只用rebase就够了,如果你有自己的贡献,就需要使用merge来合并分支
七、GitHub的ssh免密推送
-
开启终端。
-
粘贴下面的文本,替换您的GitHub电子邮件地址。
$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
这将使用提供的电子邮件作为标签创建一个新的ssh密钥。
> Generating public/private rsa key pair.
-
系统提示您“输入要保存密钥的文件”时,按Enter键。使用默认文件位置。
> Enter a file in which to save the key (/home/you/.ssh/id_rsa): [Press enter]
-
在提示符下,键入安全密码。其实可以不使用密码,有一些应用可能需要写入密码
> Enter passphrase (empty for no passphrase): [Type a passphrase] > Enter same passphrase again: [Type passphrase again]
将SSH密钥添加到ssh-agent
在将新的SSH密钥添加到ssh-agent以管理密钥之前,您应该检查现有的SSH密钥并生成新的SSH密钥。
-
在后台启动ssh-agent。
$ eval "$(ssh-agent -s)" > Agent pid 59566
-
将SSH私钥添加到ssh-agent。如果使用其他名称创建密钥,或者要添加具有不同名称的现有密钥,请将命令中的id_rsa替换为私钥文件的名称。
$ ssh-add ~/.ssh/id_rsa
- 将公钥里面的文件复制到GitHub的新建ssh选项中