git 知识点

Git基本常用命令如下:

 
git其实有好几个区,工作区(workspace)暂存区(index)本地仓库(local repository),当然还有远程仓库(remote repository)。远程仓库为我们保存一份代码拷贝,如github,而工作区、暂存区和本地仓库都在本地,这就是为什么没有网络我们也照样使用git提交(commit)代码更新,因为提交仅是提交到本地仓库,待有网络之后可以再推送(push)到远程仓库。
 

 ssh配置

ssh-keygen -t rsa -C “邮箱”    
生成本地公钥和秘钥对,一路回车,id_rsa(私钥)id_rsa.pub(公钥)公钥提交到GitHub中,Account seetings -> ssh and gpg keys 

配置信息

配置信息作为分布式的唯一身份标识
git config --global user.name ""    
git config --global user.email ""
 
若出现LF will be replaced by CRLF...
git config --global core.autocrlf false;
 

初始化

git init    把当前的目录变成可以管理的git仓库,生成隐藏.git文件。
 

添加到暂存区

git add XX    把xx文件添加到暂存区(stage)去。
git add *.php    所有php文件进行提交
git add dir/    把目录的文件提交
git add .    把所有工作区文件一次性提交
 

提交到本地版本库

git commit  –m "XX"    提交文件到版本库(分支) 暂存区=》版本库 –m 后面的是注释。
git commit -am  "XX"    已跟踪的文件可不通过git add 直接提交
 

仓库状态

git status    查看仓库状态,红色 =>未添加,绿色 => 未上传
 

比较

git diff XX    查看XX文件修改了那些内容
git diff --staged    比较暂存区与版本库的文件差异
git diff 版本号 版本号 
git diff 分支 分支
 

查看历史记录,从近到远的提交日志

git log     详细日志
git log --oneline    简化日志,7位hash和修改注释
git log --pretty=oneline    简单的日志,32位hash和修改注释
git reflog    查看历史记录的版本号id
git log --graph    查看分支合并图
 

版本回退

git reset --hard HEAD^ 或者 git reset --hard HEAD~ 回退到上一个版本
(如果想回退到100个版本,使用git reset –hard HEAD~100 )
git reset --hard commit-id    回退到指定版本号  commit-id推荐在6位以上
 

 撤销工作区的修改

git checkout  -- XX    把XX文件在工作区的修改全部撤销。
    1.提交到了暂存区,放弃修改 
         git reset HEAD 文件名    退到工作区
         git checkout -- 文件名
    2.还未提交到暂存区
        git checkout -- 文件名
    3.提交到了版本库,想撤销本次提交,用版本回退,前提是没有提交到远程
 

删除文件

git rm XX    删除XX文件,并提交到暂存区
 
 

本地仓库和远程仓库进行关联

git  remote  add origin https://github.com/tugenhua0707/testgit 关联一个远程库 origin是远程库的名称,可改;关联后,后续不在执行;
 
git push  –u(第一次要用-u 以后不需要 表示云端) origin(远程仓库名) master   把当前master分支推送到远程库,-u表示git会关联远程的master分支到本地分支;
git push origin master    Git会把master分支推送到远程库对应的远程分支上;
git push
 

 克隆

git  clone  https://github.com/tugenhua0707/testgit   从远程库中克隆,在本地生成一个目录与远程主机的版本库同名,可以添加第二个参数,修改目录名
git clone <版本库的网址> <本地目录名>
克隆版本库的时候,所使用的远程主机自动被Git命名为origin。如果想用其他的主机名,需要用git clone命令的-o选项指定。
git    clone     -b    5.6    https://github.com/laravel/laravel.git     指定版本

分支

git的分支本质上是个指向commit提交对象的可变指针。
存在名为HEAD的特殊指针,指向正在工作的本地分支。切换分支是HEAD的指向跟随变化的
git branch    查看当前所有的分支
git branch –d dev    删除dev分支
git push origin --delete <branchName>    #删除远程分支
git push origin :branchName
git branch -m  旧名  新名    #重命名
git branch name    创建name分支
git checkout master    切换回master分支
git checkout –b dev    创建dev分支 并切换到dev分支上
git merge dev    在当前的分支上合并dev分支 
    1.必须切换到master
    2.如果有相同部分会报错,会把冲突文件标记出来,同时会暂停提交行为,需手动修改解决冲突后,再提交修改,最后才是整个合并过程的完成; 
 

 储藏区

git stash    把当前的工作隐藏起来 等以后恢复现场后继续工作
git stash list    查看所有被隐藏的文件列表
git stash apply    恢复被隐藏的文件,但是内容不删除,需drop
git stash drop    删除文件
git stash pop    恢复文件的同时 也删除文件
 

 
为了便于管理,Git要求每个远程主机都必须指定一个主机名。
 
git  remote    列出所有远程主机
git  remote –v    查看远程库的详细信息(网址)
 
git remote show 命令加上主机名,可以查看该主机的详细信息。git remote命令就用于管理主机名 
$ git remote show <主机名>
 
git remote add 命令用于添加远程主机。
$ git remote add <主机名> <网址>
 
git remote rm 命令用于删除远程主机。 
$ git remote rm <主机名>
 
git remote rename 命令用于远程主机的改名。
$ git remote rename <原主机名> <新主机名>
 
git remote set-url 命令用于修改远程主机的地址
$ git remote set-url <主机名> <网址> 
 
 

git fetch

一旦远程主机的版本库有了更新 需要将这些更新取回本地,这时就要用到git fetch命令。
git fetch命令通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响。
 
git fetch -p
同步远程分支,如果失效则删除。
 
git fetch <远程主机名>
默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。
 
git fetch <远程主机名> <分支名>
比如,取回origin主机的master分支
 $ git fetch origin master
 
取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:
$ git log -p FETCH_HEAD
 
所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。比如origin主机的master,就要用origin/master读取。
git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支
 $ git branch -r 
 
$ git branch -a
上面命令表示,本地主机的当前分支是master,远程分支是origin/master
 
取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。
 $ git checkout -b newBrach origin/master
上面命令表示,在origin/master的基础上,创建一个新分支。
 
此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。
 $ git merge origin/master
# 或者
$ git rebase origin/master
上面命令表示在当前分支上,合并origin/master。
 

git rebase 远程分支,落后的commits

1. 将目标远程分支checkout到本地;如:

   git remote add Upstream  https://github.com/apache/spark.git

   git remote update Upstream

   git checkout -t  Upstream/branch-2.4.5

2. 切换到自己的开发分支,将mr相关commits rebase 合并为一个commit;(commit需分开的视情况而定)

3. 自己的开发分支,执行 git rebase branch-2.4;

4. 最后将rebase后的开发分支,git push -f 到自己的远程仓库开发分支上,MR即可更新;

 

git pull

git pull 命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。
 
git pull <远程主机名> <远程分支名>:<本地分支名>
比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。
$ git pull origin next:master
 
如果远程分支是与当前分支合并,则冒号后面的部分可以省略。
$ git pull origin next
 
上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。
$ git fetch origin
$ git merge origin/next
 
在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支。
Git也允许手动建立追踪关系。
 git branch --set-upstream master origin/next
上面命令指定master分支追踪origin/next分支。
如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。
 $ git pull origin
上面命令表示,本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并。
如果当前分支只有一个追踪分支,连远程主机名都可以省略。
 $ git pull
上面命令表示,当前分支自动与唯一一个追踪分支进行合并。
如果合并需要采用rebase模式,可以使用--rebase选项。
 $ git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。
但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。
 $ git pull -p
# 等同于下面的命令
$ git fetch --prune origin
$ git fetch -p
 

git fetch 和 git pull 的区别
 
git fetch是将远程仓库的更新获取到本地仓库,不影响其他区域。而git pull则是一次性将远程仓库的代码更新到工作区(同时也会更新本地仓库)。
 
FETCH_HEAD: 是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。
commit-id:在每次本地工作完成后,都会做一个git commit 操作来保存当前工作到本地的repo, 此时会产生一个commit-id,这是一个能唯一标识一个版本的序列号。 在使用git push后,这个序列号还会同步到远程仓库。
 
git fetch:这将更新git remote 中所有的远程仓库所包含分支的最新commit-id, 将其记录到.git/FETCH_HEAD文件中 
git fetch更新远程仓库的方式如下:
 
git fetch origin master:tmp
//在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支
git diff tmp
//来比较本地代码与刚刚从远程下载下来的代码的区别
git merge tmp
//合并temp分支到本地的master分支
git branch -d temp
//如果不想保留temp分支 可以用这步删除
 
git pull : 首先,基于本地的FETCH_HEAD记录,比对本地的FETCH_HEAD记录与远程仓库的版本号,然后git fetch 获得当前指向的远程分支的后续版本的数据,然后再利用git merge将其与本地的当前分支合并。所以可以认为git pull是git fetch和git merge两个步骤的结合。
 
git pull的用法如下:
git pull <远程主机名> <远程分支名>:<本地分支名>
//取回远程主机某个分支的更新,再与本地的指定分支合并。
 
git pull = git fetch + git merge
git pull会将本地库更新至远程库的最新状态 由于本地库进行了更新,HEAD也会相应的指向最新的commit id
git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
 
比如:
取回 origin/next 分支,再与当前分支合并。
 
git pull origin next
================
git fetch origin
git merge origin/next
 

 
git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相仿。
$ git push <远程主机名> <本地分支名>:<远程分支名>
注意,分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。
如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。
$ git push origin master
上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。
如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
$ git push origin :master
# 等同于
$ git push origin --delete master
上面命令表示删除origin主机的master分支。
如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
$ git push origin
上面命令表示,将当前分支推送到origin主机的对应分支。
如果当前分支只有一个追踪分支,那么主机名都可以省略。
$ git push
如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。
$ git push -u origin master
上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。
不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。
$ git config --global push.default matching
# 或者
$ git config --global push.default simple
还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用--all选项。
$ git push --all origin
上面命令表示,将所有本地分支都推送到origin主机。
如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用--force选项。
$ git push --force origin
上面命令使用--force选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用--force选项。
最后,git push不会推送标签(tag),除非使用--tags选项。
$ git push origin --tags 
推送本地所有标签
 
$ git push origin v1.0
 
 

默认,前开后闭
git  rebase -i 分支
git  rebase  -i  hash值^    # 使用^符号来关闭前
git  reset  --hard  origin  # 回滚远程分支
 
git rebase -i 弹出界面后:
-s  压缩提交信息
-r  修改提交信息
https://www.cnblogs.com/dudu/p/4705247.html
 
默认,前开后闭
git  cherry-pick  hash值  # 挑一条记录
git  cherry-pick  hash值^...hash值   #挑一段
 
git  merge  xxx  --ff
git  merge  xxx  --no-ff
git  merge  xxx  --ff-only
 
git  push origin dev -f
 
tag标签:
 
删除所有本地标签
git tag -d $(git tag -l)
 
删除所有远程标签
git push origin --delete $(git tag -l)
 
删除远程某个标签
git push origin :refs/tags/标签名
 
获取远程所有标签
git fetch
 
 

 
master指向提交,HEAD 指向当前分支  

create a new repository on the command line

git init
git add README.md
git commit -m "first commit"
git push -u origin master
 
 

git如何忽略已经提交的文件 (.gitignore文件无效)

 
 
git忽略已经被提交的文件,以及如何恢复追踪
 

git token 提交方式:

remote: Support for password authentication was removed on August 13, 2021

 

posted @ 2020-03-04 16:45  白開水  阅读(175)  评论(0编辑  收藏  举报