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 fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。

所以,默认情况下,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操作会生成一个新的节点,之前的提交分开显示。而rebase操作不会生成新的节点,是将两个分支融合成一个线性的提交,并且是以test分支,复位了基底。通过上面可以看到,想要更好的提交树,使用rebase操作会更好一点。这样可以线性的看到每一次提交,并且没有增加提交节点。
 
 

解决冲突

在我们操作过程中。merge 操作遇到冲突的时候,当前merge不能继续进行下去。手动修改冲突内容后,add 修改,commit 就可以了

 

错误add

git rm xx.file (这是相对add的反操作)

 

posted @ 2020-07-12 15:49  clemente  阅读(205)  评论(0编辑  收藏  举报