git all in one

| 分类 utilities  | 标签 git 

git 常用命令

command explaination
git init 将当前文件夹初始化成git本地仓库
git add readme.txt 把文件从工作区添加到暂存区
git commit -m “提交说明” 把文件从暂存区添加到本地仓库
git status 查看当前目录中文件的状态
git diff readme.txt 显示本地仓库的文件,与当前文件的对比
git log 显示从最近到最远的提交日志
git log –pretty=oneline git log输出信息的简化版
git reset –hard HEAD^ 回滚到上一个版本
git reset –hard 328164 回滚到特定commit_id的版本
git reset HEAD readme.txt 把暂存区的修改回退到工作区
git reflog 查看命令历史
git checkout – readme.txt 把readme.txt文件在工作区的修改全部撤销,这里有两种情况:一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
git rm readme.txt 从版本库中删除文件
git remote add origin git@github.com:vincen/helloworld4.git 将本地仓库关联远程库
git push -u origin master 第一次推送master分支的所有内容
git push origin master 将本地库推送到远程库
git clone github.com/helloworld4.git 从远程地址复制库到本地
git branch 查看分支,带星的为当前分支
git branch <name> 创建分支
git checkout <name> 切换分支
git checkout -b <name> 创建+切换分支
git merge <name> 合并某分支到当前分支
git merge –on-ff -m “注释” <name> 合并某分支到当前分支,强制禁用Fast forward 模式,这样就能从分支历史上看到分支信息。
git branch -d <name> 删除分支
git branch -a 列出所有分支
git stash 隐藏当前工作空间
git stash list 显示隐藏的工作空间列表
git stash apply stash@{0} 恢复,但是stash内容并不删除
git stash drop 删除stash内容
git stash pop 恢复的同时把stash内容也删了

git 常用操作

开发过程中有三个分支:

version description
master 主版本
develper 开发与测试的版本,待稳定后,会合并到主版本
myself 个人的开发版本

将 develop 分支合并到 master 分支

$ git fetch
$ git checkout develop
$ git pull
$ git checkout master
$ git merge develop
# 将合并后的代码提交到 master 分支的远程仓库,此处不用 add 和 commit
$ git push origin master

撤销所有暂存区的内容

git add . 之后,加入了很多不想提交的文件或文件夹,一个个撤销太麻烦。可以用如下命令:

$ git rm -r --cached .

Everything back to the start point.

获取远程分支

# 获取远程分支信息获取到本地
$ git fetch
# 将远程分支映射到本地命名为 local_branch_name 的一分支
$ git checkout -b local_branch_name origin/remote_branch_name

初始化提交 master 分支

$ git push git@github.com:vincen/fuqssi-boot.git master

删除分支

$ git branch -d 分支名			# 删除本地分支
$ git push origin --delete 分支名	# 删除远程分支

跟踪分支、清理远程分支的缓存

# 使用如下命令来查看有关于 origin 的一些信息,包括分支是否 tracking。
git remote show origin
# 在 github 上删除分支之后,本地还是能看到远程分支,使用如下命令清除缓存
git remote prune origin

git 添加 gpg

Mac 上可以使用图形化的 GPG Suite,比较简单。使用如下命令在 git 中添加 gpg:

# DE937B14 是我的Key id
git config --global user.signingkey DE937B14
# 让本地所有的仓库都进行 GPG 验证
git config --global commit.gpgsign true

打标签、推标签

# 普通含附注的标签
git tag -a v1 -m 'message'
# gpg 签名的标签
git tag -s v1 -m 'message'
# 推送所有标签
git push origin --tags

版本回退

master <—— v2.6 <—— v2.5

将本地代码和远程仓库代码都回退到 v2.6 版本,但是由于操作失误,回退到了 v2.5 版本。按照如下方式撤销,再回退。

# 查看版本历史记录
$ git log --graph --decorate --oneline --simplify-by-decoration --all
* 20b794f (HEAD -> master, origin/master, origin/HEAD) update dependencies.
| * c97aa16 (origin/deploy) Merge branch 'master' into deploy
|/  
* babebde (tag: v2.6) :bookmark: [版本发布](v2.6)
| * 25c2bba (origin/mybatis-plus) 隐藏AppRun接口 (#459)
|/  
* 66eeb7c (tag: v2.5) :bookmark: v2.5 版本发布
* da00662 (tag: v2.4) :bookmark: v2.4 版本发布,详情查看发行版说明

# 操作失误,回退到 v2.5 版本,吓出了一身冷汗。
$ git reset --hard 66eeb7c

# 好在每次重要操作都会被记录到 reflog 中,使用git reflog 查看较危险的操作
$ git reflog
66eeb7c (HEAD -> master, tag: v2.5) HEAD@{0}: reset: moving to 66eeb7c
20b794f (origin/master, origin/HEAD) HEAD@{1}: checkout: moving from 2.7 to master
20b794f (origin/master, origin/HEAD) HEAD@{4}: checkout: moving from master to 2.7
20b794f (origin/master, origin/HEAD) HEAD@{5}: commit: update dependencies.

# 使用 git reset --hard 再恢复到 master。
$ git reset --hard 20b794f
HEAD is now at 20b794f update dependencies.

# 小心翼翼的回退到 v2.6 版本上。
$ git reset --hard babebde
HEAD is now at babebde :bookmark: [版本发布](v2.6)

# 将当前内容推送到远程分支上,本地和远程回退完成。
$ git push -f origin master

Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:vincen/eladmin.git
 + 20b794f...babebde master -> master (forced update)

暂存

在 A 分支上开发的内容并没有完成,现在需要切换到 B 分支开发,就需要暂存 A 分支的内容。

# 将 git add 之后,但是没有执行 git commit 的文件,暂存起来
$ git stash save "application-dev with my mysql password"
Saved working directory and index state On 2.7: application-dev with my mysql password

# 查看 stash 存储了哪些内容
$ git stash list

# 查看做了哪些改动,默认显示第一个存储
$ git stash show
# 直接指明要查看第0个存储的改动,后边命令都可以带上或不带具体的存储号即: stash@{0}
$ git stash show stash@{0}
 eladmin-system/src/main/resources/config/application-dev.yml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

# 上边那个命令看的太粗略,不具体。需要看改动的详细内容
$ git stash show 【stash@{0}-p

# 应用某个存储,但不会把存储从存储列表中删除
$ git stash apply【stash@{0}# 恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下
$ git stash pop 【stash@{0}# 从列表中删除某个存储
$ git stash drop stash@{0}
# 删除所有缓存的 stash
$ git stash clear

将一套代码,推到两个仓库

场景一:local repo —> remote repo 1 / remote repo 2,向两个或两个以上的远端代码仓库提交代码。

场景二:remote repo 1 —> local repo —> remote repo 2,从一个代码仓库拉取代码并同步到另一个代码仓库

需要,或者向的情况。比如,基于开源项目的二开项目。为了获得开源项目的最新代码(功能),需要时不时的从开源项目的代码仓库(gitee.com、github.com等)拉取新代码,然后提交到本地二开后的代码仓库。

下面以 DRM 项目为示例,示例说明:

代码仓库原始地址在gitee.com上:https://gitee.com/devon/drm.git

现迁移一份到我司代码仓库:http://code.example.com/devon/drm.git

目前两个代码库的代码是一样的。

方案一

配置两个独立仓库,通过 git push 命令推送到指定仓库的方式实现代码同步。

# 当前仓库配置信息
$ git remote -v
origin  https://gitee.com/devon/drm.git (fetch)
origin  https://gitee.com/devon/drm.git (push)

# 添加新的仓库,指定代码仓库的别名为:gttis
$ git remote add gttis http://code.example.com/devon/drm.git

# 添加后查看仓库名称及地址,但是此时没办法签出新仓库的代码分支,因为仓库信息还没有被拉取下来
$ git remote -v
origin  https://gitee.com/devon/drm.git (fetch)
origin  https://gitee.com/devon/drm.git (push)
gttis 	http://code.example.com/devon/drm.git (fetch)
gttis 	http://code.example.com/devon/drm.git (push)

# 拉取新仓库的元数据信息(分支、标签等)
$ git fetch gttis
From http://code.example.com/devon/drm

* [new branch]      master     -> gttis/master

到这里两个远端仓库分支的信息都被拉到本地了。接下来,我们可以在一个分支上做一些代码修改,然后分别向两个仓库提交代码了。

# 将代码推到原代码仓库
$ git push origin master
# 将代码提交到新的代码仓库
$ git push gttis master

方案二

有没有可能一次就提交到多个代码仓库?答案是肯定的,方法就是向当前仓库追加一个远端仓库地址。

# 在当前仓库状态下,追加入新的代码仓库
$ git remote set-url --add origin http://code.example.com/devon/drm.git
$ git remote -v
origin  https://gitee.com/devon/drm.git (fetch)
origin  https://gitee.com/devon/drm.git (push)
origin  http://code.example.com/devon/drm.git (push)

这里是向默认仓库组 origin 追加一个新的推送(push)地址,从 url 后面的标识不难看出,当执行 fetch 命令的时候,走的是 gitee.com 的地址,当推送的时候,将推给两个仓库

修改本地文件,把修改推送到远程仓库,从日志中可以看出它一次向两个仓库推送了代码。

$ git push origin
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 293 bytes | 146.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.0]
To https://gitee.com/devon/drm.git
   ffd788b..857bd40  master -> master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 293 bytes | 146.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://code.example.com/devon/drm.git
   ffd788b..857bd40  master -> master

方案三

本方案的核心是添加多个仓库,然后通过 git merge 或者 git cherry-pick 的方式来管理代码,该方案相对自主选择性比较强些,但操作上也相对麻烦。

# 在当前仓库状态下,添加新的代码仓库并查看结果
$ git remote add gttis http://code.example.com/devon/drm.git
$ git remote -v
origin  https://gitee.com/devon/drm.git (fetch)
origin  https://gitee.com/devon/drm.git (push)
gttis 	http://code.example.com/devon/drm.git (fetch)
gttis 	http://code.example.com/devon/drm.git (push)

# 拉取新仓库的元数据信息(分支、标签等)
$ git fetch gttis
From http://code.example.com/devon/drm

* [new branch]      master     -> gttis/master

到这里两个远端仓库分支的信息都被拉到本地了。接下来,我们可以在一个分支上做一些代码修改,然后通过 git merge 的方式将代码合并到另一个仓库分支并提交。

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
drm(master) git commit -a -m 'for testing'
[master 857bd40] for testing
 1 file changed, 1 insertion(+), 1 deletion(-)
drm(master) git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 297 bytes | 99.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.0]
To https://gitee.com/devon/drm.git
   857bd40..5039fc8  master -> master

签出新仓库的Master分支代码

$ git checkout -b gttis_master gttis/master
Switched to a new branch 'gttis_master'
Branch 'gttis_master' set up to track remote branch 'master' from 'gttis'.

合并老分支的代码并提交

$ git merge master
Updating 857bd40..5039fc8
Fast-forward
 README.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

$ git push gttis HEAD:master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 297 bytes | 148.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://code.example.com/devon/drm.git
   857bd40..5039fc8  HEAD -> master

至此,我们搞定了向多个远端仓库提交代码的办法了。

当环境迁移结束后,老代码仓库将被废弃,此时可以通过以下方式将老代码仓库删除,以方便后续开发。

删除老仓库

$ git remote remove origin

将新仓库重名名为默认远端仓库名称

$ git remote rename gttis origin

上一篇     下一篇