git~总结一些不常用~但很有用的操作

  • git ssh公钥私钥生成
ssh-keygen
  • git 查看远和程仓库信息
 git remote show origin
  • git add总结
·  git add -A  提交所有变化

·  git add -u  提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)

·  git add .  提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
  • 切换分支和强行切换分支
git checkout origin/dev 
//建立本地分支dev,并与远程dev做关联
git checkout -b dev origin/dev //建立本地分支dev,并与远程dev做关联
git checkout -f origin/dev //强行切换 
  • 查看分支
git branch //本地分支
git branch -r //远程分支
git branch -a //全部分支

//拉取远程所有分支到本地
 git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

  • 克隆远程仓库
git clone git-address
  • 快速克隆【不关注历史版本】
git clone --depth=1  git-address
  • 删除所有本地分支,除了DEV
git stash && git checkout dev && git branch | grep -v "dev" | xargs git branch -D

  • 删除缓存,添加ignor
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
  • 添加变更并提交
git add -A  # A表示把所有更新添加到临时区
git commit -m "注释"
  • 拉最和推送代码
git pull # 拉取
git push # 推送,在push之前应该先pull仓库,确保你的分支代码是最新的,即commit是最新的
  • 删除缓存,过滤文件通用代码.gitignore
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
  • 新建本地分支
git checkout -b 123;
  • 本地分支推到远程,并建立关联
git push --set-upstream origin 123
  • 获取最新的远程分支信息(比如你在远程删除某个分支,或者添加新分支,希望本地同步删除或者新加)
git fetch --prune  # git fetch -p
  • 删除本地不存在的远程分支(只对删除远程分支同步到本地)
git remote prune origin
  • 标签tag的操作
git tag #查看版本
git tag [name] #创建版本
git tag -d [name] #删除版本
git tag -r #查看远程版本
git push origin [name] # 创建远程版本(本地版本push到远程)
git push origin :refs/tags/[name] # 删除远程版本
  • 合并rebase分支,下面代码将dev的代码合并到master分支,master上将有dev提交的commit
git checkout dev
git pull --rebase
git checkout master
git rebase dev
# 解决冲突
git add -A
git rebase –continue
git push -f
# 自动全并COMMIT:git commit --amend --no-edit 如果代码没有冲突,5,6,7可以省略
  • 将当前分支与远程master分支合并,并不要merge commit,让commit更简洁
$root(dev) git pull --rebase origin master 
  • 拉取所有远程分支到本地
for i in `git branch -r`; do git checkout `basename $i` ; done
  • 如果通过rebase方式合并代码,冲突太多,可以通过merge的方式来合并,下面代码实现把dev分支代码合并到master分支,这样在下次cicd过程中,就不会再有代码冲突了
git checkout master && git pull
git checkout master
git merge dev
//开始解决代码冲突
git add .
git merge --continue 
git push -f
  • 将多个commit合并成一个
git merge-base origin/dev my
# display your hashcode
git reset --soft `your hashcode`
git add -A
git commit -m "commit"
git push -f
  • 多个commit进行压缩,即squash commit
    • 有两种方法可以实现 Git 压缩:
      • git rebase -i 作为用于压缩提交的交互式工具
      • git merge -squash 在合并时使用 -squash 选项
# 要压缩最近四个提交,我们将执行以下操作
$ git rebase -i HEAD~4
# 将feature1合并到main分支,合并时先压缩feature1分支的提交消息,最后我们看main分支中只有一条提交消息,feature1源分支并不合并。
git checkout main
git merge --squash feature1
git commit -am 'Merged and squashed the feature1 branch changes'
  • 将commitid合并到master分支
git checkout master  //切换到要合并的目标分支上
git cherry-pick xxxx(对应commit版本号)   //选择一个commit版本号,合并进当前分支
git push  //推送到目标分支远

# 如果有冲突,就先解决
git add .
git cherry-pick --continue
git push -f
  • 迁出某个commit并生成一个分支
git checkout dd5f #dd5f为commitId,可以迁出这个dd5f,然后对内容进行修改,再提交成一个分支
echo “hello” >> 9.txt
git add .
git commit -m “modify 9.txt”
git checkout -b modify_9_success
git push --set-upstream origin modify_9_success # --set-upstream将本地modify_9_success与远程(origin)的modify_9_success进行了关联
  • 将本地仓库上传到线上
  1. 在远程建立一个仓库,它有https和ssh的地址
  2. 本地建立仓库文件夹 mkdir validate
  3. 在进行文件夹,cd validate
  4. git初始化,git init
  5. 映射远程仓库,git remote add origin git@github.com:bfyxzls/PayProject.git
  6. 添加一个readme.md文件
  7. 添加它到本地仓库,git add readme.md
  8. 提交本地,git commit -m "initial"
  9. 将本地仓库提交的内容推到远程仓库的对应分支,git push -u origin master
  10. 大功告成
  • 查看提交的日志
git log --oneline //会列出所有commitId
  • 直接切换到历史版本
 git reset --hard commitId
  • 打标签

我们可以为某个时间点上线的版本打个标签,当这个版本有问题时,可以去还原它。

  1. 列表所有标签 git tag
  2. 筛选标签 git tag -l 'v1.4.*'
  3. 新建标签 git tag -a v1.4 -m '对标签的描述'
  4. 显示标签的具体信息 git show v1.4
  5. 上传标签 git push origin v1.5
  • 显示工作区根目录,执行命令
git rev-parse --show-toplevel
  • 显示dev分支最近一次的commitId
git rev-parse origin/dev

仓库初始化

git config --global user.name "zhangzhanling"
git config --global user.email "zhangzhanling@chinalawinfo.com"

Create a new repository

git clone git@192.168.0.161:zhangzhanling/helm-charts.git
cd helm-charts
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master #-u是--set-upstream的缩写

Existing folder or Git repository

cd existing_folder
git init
git remote add origin git@192.168.0.161:zhangzhanling/helm-charts.git
git add .
git commit
git push -u origin master

保存密码

git config –global credential.helper cache
如果想自己设置时间,可以这样做:

git config credential.helper ‘cache –timeout=3600’
这样就设置一个小时之后失效
长期存储密码:

git config --global credential.helper store

git 批量删除标签

  • 删除所有远程标签
    git show-ref --tag | awk '{print ":" $2}' | xargs git push origin

  • 删除所有本地标签
    git tag -l | xargs git tag -d

git merge(相当于--ff,fast-forward ) 和 git merge --no-ff

fast-forward

Git 合并两个分支时,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,叫做“快进”(fast-forward)不过这种情况如果删除分支,则会丢失merge分支信息。

–squash

把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,于是使用–squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。

–no-ff

关闭fast-forward模式,在提交的时候,会创建一个merge的commit信息,然后合并的和master分支
merge的不同行为,向后看,其实最终都会将代码合并到master分支,而区别仅仅只是分支上的简洁清晰的问题,然后,向前看,也就是我们使用reset 的时候,就会发现,不同的行为就带来了不同的影响

为github三方仓库添加贡献

  1. FORK Higress 到您的存储库。要完成这项工作,您只需单击 alibaba/higress 主页右侧的 Fork 按钮。然后你将在
    中得到你的存储库https://github.com/<your-username>/higress,其中your-username是你的 GitHub 用户名。

  2. 克隆 您自己的存储库以在本地开发. 用于 git clone git@github.com:<your-username>/higress.git 将存储库克隆到本地计算机。 然后您可以创建新分支来完成您希望进行的更改。

  3. 设置远程 将上游设置为 git@github.com:alibaba/higress.git 使用以下两个命令:

git remote add upstream git@github.com:alibaba/higress.git
git remote set-url --push upstream no-pushing

这两句命令的作用是在git中配置远程仓库。第一条命令git remote add upstream git@github.com:alibaba/higress.git的作用是将远程仓库的地址添加到本地仓库中,并给它起一个别名"upstream"。这样做可以让你从该远程仓库获取代码,比如进行git fetch upstream来拉取最新的代码。

而第二条命令git remote set-url --push upstream no-pushing的作用是设置"upstream"远程仓库的推送地址为"no-pushing",这意味着你在使用git push命令时,不能直接将代码推送到"upstream"远程仓库,从而避免了意外地向上游仓库推送代码。

使用此远程设置,您可以像这样检查您的 git 远程配置:

$ git remote -v
origin     git@github.com:<your-username>/higress.git (fetch)
origin     git@github.com:<your-username>/higress.git (push)
upstream   git@github.com:alibaba/higress.git (fetch)  #你使用git pull upstream,git fetch upstream 获取上游的变更
upstream   no-pushing (push)

添加这个,我们可以轻松地将本地分支与上游分支同步。

将上游分支rebase到本地分支

$ git pull --rebase upstream main 

合并结果如下

remote: Enumerating objects: 183, done.
remote: Counting objects: 100% (183/183), done.
remote: Compressing objects: 100% (131/131), done.
remote: Total 183 (delta 48), reused 126 (delta 27), pack-reused 0
Receiving objects: 100% (183/183), 217.01 KiB | 12.76 MiB/s, done.
Resolving deltas: 100% (48/48), completed with 15 local objects.
From github.com:keycloak/keycloak
 * branch                  main       -> FETCH_HEAD
   d004e9295f..94512ea20b  main       -> upstream/main
Updating 7e0cbcafae..94512ea20b
Fast-forward
 .github/actions/build-keycloak/action.yml          |    3 +-
 .github/scripts/pr-find-issues.sh                  |   29 +
 .github/workflows/ci.yml                           |    2 +-
 .github/workflows/codeql-analysis.yml              |    3 +
 .github/workflows/documentation.yml                |    9 +-
 .github/workflows/guides.yml                       |    3 +
 .github/workflows/js-ci.yml                        |    5 +-
 .github/workflows/label.yml                        |   57 +
 .github/workflows/operator-ci.yml                  |    5 +-
 .github/workflows/snyk-analysis.yml                |    5 +-
 .github/workflows/trivy-analysis.yml               |    2 +-
 .../src/main/java/org/keycloak/common/Profile.java |    2 -

分支定义

现在我们假设通过拉取请求的每个贡献都是针对 Higress 中的 主分支 。在贡献之前,请注意分支定义会很有帮助。

作为贡献者,请再次记住,通过拉取请求的每个贡献都是针对主分支的。而在Higress项目中,还有其他几个分支,我们一般称它们为release分支(如0.6.0、0.6.1)、feature分支、hotfix分支。

当正式发布一个版本时,会有一个发布分支并以版本号命名。

在发布之后,我们会将发布分支的提交合并到主分支中。

当我们发现某个版本有bug时,我们会决定在以后的版本中修复它,或者在特定的hotfix版本中修复它。当我们决定修复hotfix版本时,我们会根据对应的release分支checkout hotfix分支,进行代码修复和验证,合并到主分支。

对于较大的功能,我们将拉出功能分支进行开发和验证。

将分支推送到远程上游仓库

这个主要是考虑到,你把第三方仓库拉到本地进行功能扩展,设置远程三方仓库名为upstream(一般远程名为origin),本地分支名为zzl,我的功能在本地分支zzl上进行了开发,推到自己的远程origin仓库,现在要把它推到三方仓库,我们不建议(你也没权限)直接推到三方远程仓库,一般是在自己的远程仓库建立"pull request",把分支合并到三方的远程仓库,合并第三方仓库之前,会有专业的技术人员来review你的代码,你还需要签署相关的协议,具体如下:
要提交一个 Pull Request(PR),将你的远程分支合并到三方仓库的远程分支,你可以按照以下步骤进行操作:

1. 在你的远程仓库中,确保你的新功能分支是最新的,并且包含了你希望合并的更改。

2. 进入你的远程仓库页面,在页面上方会有一个"Pull Request"或"New Pull Request"的按钮,点击它。

3. 在弹出的页面中,选择 "base repository" 为目标三方仓库,选择 "base branch" 为目标远程分支,然后选择 "head repository" 为你的远程仓库,选择 "compare branch" 为你的新功能分支。

4. 确认比较和合并的分支信息无误后,点击相应的按钮来创建 Pull Request。

5. 填写相关的 PR 描述、标题等信息,然后提交 Pull Request。

这样,你就向目标三方仓库提交了一个 Pull Request,请求他们将你的新功能分支合并到他们的远程分支中。之后,目标仓库的所有者或管理员就可以对你的 PR 进行审查、讨论,并决定是否接受并合并你的更改。
posted @ 2020-05-07 13:53  张占岭  阅读(385)  评论(0编辑  收藏  举报