git常用命令行

一、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免密推送

官方文档
https://help.github.com/en/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#adding-your-ssh-key-to-the-ssh-agent

  1. 开启终端

  2. 粘贴下面的文本,替换您的GitHub电子邮件地址。

    $ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

    这将使用提供的电子邮件作为标签创建一个新的ssh密钥。

    > Generating public/private rsa key pair.
  3. 系统提示您“输入要保存密钥的文件”时,按Enter键。使用默认文件位置。

    > Enter a file in which to save the key (/home/you/.ssh/id_rsa): [Press enter]
  4. 在提示符下,键入安全密码。其实可以不使用密码,有一些应用可能需要写入密码

    > Enter passphrase (empty for no passphrase): [Type a passphrase]
    > Enter same passphrase again: [Type passphrase again]

将SSH密钥添加到ssh-agent

在将新的SSH密钥添加到ssh-agent以管理密钥之前,您应该检查现有的SSH密钥生成新的SSH密钥

  1. 在后台启动ssh-agent。

    $ eval "$(ssh-agent -s)"
    > Agent pid 59566
  1. 将SSH私钥添加到ssh-agent。如果使用其他名称创建密钥,或者要添加具有不同名称的现有密钥,请将命令中的id_rsa替换为私钥文件的名称。

    $ ssh-add ~/.ssh/id_rsa
  2. 将公钥里面的文件复制到GitHub的新建ssh选项中
原文地址:https://www.cnblogs.com/nobushi/p/10751052.html