Git

Table of Contents

添加公钥

  • 在~/.ssh 下生成公钥,命名默认(id_rsa)
  • 把 id_rsa.pub内容复制到git仓库中添加ssh公钥里面
  • 测试是否添加成功
ssh -T git@github.com   *github

ssh -T git@git.coding.net   *腾讯云
  • 如果遇到错误,输入ssh -v git@git.coding.net 检查

git多用户切换


$ ssh-add  ~/.ssh/itgo
Identity added: /Users/yangceo/.ssh/itgo (/Users/yangceo/.ssh/itgo)

$ ssh-add -l
2048 SHA256:JNAht5MeaDsS4yymb15gwWHFB7YXB1e8/U/W4gGMLF4 /Users/yangceo/.ssh/itgo (RSA)

$ ssh -T git@github.com

Hi maniyaserverdeploy! You've successfully authenticated, but GitHub does not provide shell access.

refusing to merge unrelated histories

git pull --allow-unrelated-histories

配置别名

alias git='git --no-pager'
*查看配置
git config --list

*设置默认user和email
 git config --global user.name "输入你的用户名"
 git config --global user.email "输入你的邮箱"
*替换默认的user和email
 git config --global --replace-all user.email "输入你的邮箱"
 git config --global --replace-all user.name "输入你的用户名"

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

解决 status 中文编码

git config --global core.quotepath false

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.unstage 'reset HEAD'
git config --global alias.last 'log -1'

查看git信息


git remote -v

创建git仓库:

  git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/Itgo666/evhcApi.git
git push -u origin master

git reset <file>  * 从暂存区恢复到工作文件

git checkout -- . *丢弃工作区所有修改的内容

git reset --hard commit_id

git log --pretty=oneline

Git分支:

  查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除本地分支:git branch -D BranchName

其中-D也可以是--delete,如:git branch --delete BranchName

删除本地的远程分支:git branch -r -D origin/BranchName

远程删除git服务器上的分支:git push origin -d BranchName

其中-d也可以是--delete,如:git push origin --delete BranchName

查看本地分支及追踪的分支:git branch -vv

设置本地分支跟踪远程分支:git branch --set-upstream-to=origin/dev dev

设置本地分支master跟踪origin/<branch>远程分支:git branch --set-upstream-to=origin/<branch> master

有时会遇到git branch -a时总是不出现新的分支或者远程已经没有的分支在本地还有,这时就需要更新下本地的git分支保持和远程分支一致,使用下面命令即可:

git remote update origin --prune

注意

  • 注意:如果本地分支和远程分支不同名,是追踪不了的,git push 时,必须指定push到远程哪个分支上,比如本地分支dev2追踪到 origin/dev,那么只能从origin/dev pull更新,而当push时,必须指定,例如:git push origin HEAD:dev

未使用 git add 缓存代码时:

可以使用 git checkout -- filepathname (比如: git checkout -- readme.md ,不要忘记中间的 “--” ,不写就成了检出分支了!!)。放弃所以的文件修改可以使用 git checkout . 命令。 此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。但是此命令不会删除掉刚新建的文件。因为刚新建的文件还没已有加入到 git 的管理系统中。所以对于git是未知的。自己手动删除就好了。

已经使用了 git add 缓存了代码:

可以使用 git reset HEAD filepathname (比如: git reset HEAD readme.md)来放弃指定文件的缓存,放弃所以的缓存可以使用 git reset HEAD . 命令。 此命令用来清除 git 对于文件修改的缓存。相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了如(一)所示的状态。继续用(一)中的操作,就可以放弃本地的修改。

git正确的删除远程仓库的文件并用.gitignore忽略提交此文件


git rm -r --cached target
git commit -m "delete target/"
git push origin master

开发时,对于本地的项目中修改不做保存操作(或代码改崩),可以用到Git pull的强制覆盖,具体代码如下:

  git fetch --all
git reset --hard origin/master
git pull //可以省略
  • git fetch 指令是下载远程仓库最新内容,不做合并
  • git reset 指令把HEAD指向master最新版本

打标签

  • git tag -a v1.0 -m 'xxx最终版' * 打tag
  • git push origin [tagName] * 推送本地tag
  • git push origin –tags * 推送本地所有tag
  • git tag -n *查看tag(带注释)
  • git show v1.0 * 查看某一个tag详细
  • git tag -d v0.1.2 *本地删除tag
  • git push origin :refs/tags/<tagName> *远端删除 eg: git push origin :refs/tags/v0.1.2

切换到某个tag

  跟分支一样,可以直接切换到某个tag去。这个时候不位于任何分支,处于游离状态,可以考虑基于这个tag创建一个分支。

yk@yunke.loc:dev-demo$ git tag
0101
n
v1.0.0
yk@yunke.loc:dev-demo$ cat abc.text
1
22
dev_0101
yk@yunke.loc:dev-demo$ git co n
Note: checking out 'n'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 1e77b3b dev 1
yk@yunke.loc:dev-demo$ git tag
0101
n
v1.0.0
yk@yunke.loc:dev-demo$ git br
*(HEAD detached at n)
  dev
  dev_0101
  master

实验步骤:

1.新建分支 dev_0101 并在该分支上打标签 tag_0101 2.切换到 master 分支,删除分支 dev_0101 3.切换到 tag_0101 ,当前处于游离状态,该状态下文件内容和删除的 dev_0101 分支下的文件内容一样

小结:

1.删除分支不影响在该分支上打的标签 2.切换到标签后,此时处于游离状态

git rebase

用rebase 代替 merge

  • git pull –rebase <=> git rebase ,意思是:把远程更新以变基的方式拉下来,这样 git log 就是一条线,而没有merge产生多条线。
  • git pull –rebase <=> git rebase
  • 当/git pull/有冲突时,回退到pull之前,用/git rebase/代替
  • 当/git commit/有冲突
  • 用/git rebase/代替
  • 解决冲突
  • git rebase –continue
  • 再/git push/

Date: 2022-05-27 Fri 15:29

Author: yangk

Created: 2023-01-03 Tue 12:43

hello-world