1.git命令大全

总结一下自己常用的git命令

  1. 安装完成后,在开始菜单里找到“Git”->“Git Bash”

  2. git config –global user.name “Your Name”
    git config –global user.email “email@example.com

  3. cd F: (打开F盘)
    mkdir (创建子目录)
    pwd (显示当前目录)

  4. git init (把这个目录变成Git可以管理的仓库)

  5. git add :改动文件添加到本地仓库中的暂存区

1
2
3
4
关于git add的一点说明:
git add . # 把新增的、修改的都加到缓存
git add <file> # 提交文件,可多次提交
git add -A # 把新增、和修改的、和删除的都加到缓存,即提交所有的更改
  1. git commit -m “说明”

  2. git status (仓库当前的状态)

  3. git diff (查看不同)

  4. git log [–pretty=oneline {缩略版,可选}] (查看历史记录)

  5. git reset –hard HEAD^ (回退到上一个版本,HEAD后可以是 commit_id)

  6. git reflog (用来记录你的每一次命令,找到commit_id回到未来某个版本)

  7. git diff HEAD – (查看工作区和版本库里面最新版本的区别)

  8. git checkout – (用版本库里的版本替换工作区的版本,无论工作区是修改还是删除)

  9. git reset HEAD (把暂存区的修改撤销掉(unstage),重新放回工作区. 用HEAD时,表示最新的版本)

  10. git rm (用于删除一个文件)

  11. ssh-keygen -t rsa -C “youremail@example.com“ (创建SSH Key)

  12. git remote add origin git@github.com:Bruce333/other.git (关联github远程库)

  13. git push -u origin master/git push origin master:提交到远程仓库

    (推送到远程库,第一次用含有 -u 的命令,推送master分支的所有内容,此后用后面的命令推送最新修改)

  14. git clone git@github.com:Bruce333/other.git (克隆远程仓库到本地库)

    ps:比如GitHub,gitlab克隆仓库时就有显著性不同
    GitHub克隆时,各个分支都可以直接clone;而gitlab克隆时,只能clone主分支的仓库,切换到目标分支后,使用git pull拉取目标分支更新到本地仓库

  15. git checkout -b dev: 创建并切换目标分支

    创建dev分支,然后切换到dev分支,相当于以下两条命令:git branch dev[创建分支]/git checkout dev[切换分支]

  16. git merge dev (合并指定分支到当前分支)

  17. git checkout master (切换到master分支)

  18. git branch :列出本地所有分支,当前分支前面会标一个*号

  19. git branch -d 分支名 :删除本地分支

  20. git push origin –delete 分支名:git删除远程仓库分支

  21. git merge –no-ff -m “merge with no-ff” dev

    (通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息;–no-ff表示禁用Fast forward,用普通模式合并,合并后的历史有分支,能看出来曾经做过合并;-m参数,把commit描述写进去)

  22. git stash (把当前工作现场“储藏”起来,等以后恢复现场后继续工作)

  23. git stash list (查看工作现场) / git stash apply stash@{0} ()

  24. git stash pop (恢复的同时把stash内容也删了,相当于:git stash apply[恢复]/git stash drop[删除])

  25. git branch -D (强行删除一个没有被合并过的分支)

  26. git remote (查看远程库的信息) / git remote -v (显示更详细的信息)

  27. git checkout -b branch-name origin/branch-name (在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致)

  28. 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交

  29. git pull:抓取远程仓库下某个分支的更新,再与本地的指定分支合并(更新本地分支代码)

    把最新的提交抓下来;如果提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建.用命令git branch –set-upstream branch-name origin/branch-name)

  30. git tag <commit id 可无>

    打一个新标签,默认标签是打在最新提交的commit上的;找到历史提交的commit id,可以给历史版本打标签

  31. git show (查看标签信息)

  32. git tag (查看所有标签)

  33. git tag -a -m “blablabla…” (指定标签信息)

  34. git tag -s -m “blablabla…” (用PGP签名标签)

  35. git tag -d (删除本地标签tag)

  36. git push origin (推送某个标签到远程)

  37. git push origin –tags (一次性推送全部尚未推送到远程的本地标签)

  38. git tag -d (删除一个本地标签)

  39. git push origin –delete (删除一个远端标签)

  40. git config –global color.ui true (让Git适当地显示不同的颜色)

  41. 忽略某些文件时,需要编写.gitignore;.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理

  42. git config –global alias.st status

    告诉Git,以后st就表示status,配置别名;加上–global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用;每个仓库的Git配置文件都放在.git/config文件中,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可;而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中)

  43. git log –graph (查看分支合并图)


2019-12-16 新增:
当自己的账户有私人的GitHub和企业的gitlab时,不经意间就会将不同的用户名,邮箱搞混,幸得建彬哥真传,终于搞懂了。
1.在自己的项目文件下直接”git bash here”
2.查看当前项目所属的用户名与邮箱

git remote show origin查看当前仓库基本信息
git remote -v 查看当前项目远程地址
git branch -a 查看远程项目所有分支,红颜色分支代表当前所在分支
git config user.name 查看当前项目的用户名
git config user.email 查看当前项目的邮箱

3.设置用户名和邮件
git config [–global] user.name “用户名”
git config [–global] user.email “邮箱”
git config命令的-- global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

  1. 删除远程仓库目标分支
1
2
3
4
git branch -a : 查看所有的分支
git checkout 其它分支: 切换到其它分支才能删除目标分支
git push origin --delete 删除的远程仓库名
git branch -a : 再次查看所有的分支,确认是否已经删除了

2.git clone的说明

        git一般有很多分支,我们clone到本地的时候一般都是master分支,那么如何切换到其他分支呢?

  1. 查看所有远程分支:git branch -a
  2. 切换分支:git checkout 目标分支
  3. 同步分支:git pull

        再思考一会:首先,你需要使用 git clone 这个命令克隆一个本地库。之后它会自动克隆一个master分支(这个貌似是必须的)。之后不会克隆任何一个分支下来的。
假定你需要一个dev(此处假定远程库中已经存在此分支,也就是你需要克隆的)分支用于开发的话,你需要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是用这个命令创建本地dev分支:
$ git checkout -b dev origin/dev

再同步下:
$ git pull

这样就实现了克隆dev分支。

3.git pull与push

git 为什么要先commit,然后pull,最后再push?而不是commit然后直接push?
情况是这样的,现在远程有一个仓库,分支就一个,是master。然后我本地的仓库是从远程的master上clone下来的。大家都是clone下来,再在自己本地改好,再commit然后pull然后push,大家都是这么做的。那么现在问题来了:

  1. 那我本地这个也算是个分支?还是就是一个本地仓库?

    答:本地和远程的关系相当于两个分支,你感觉一样是因为你git pull 的时候已经自动给绑定好对应关系了, set-upstream..balbala

  2. 如果我在远程新建了个分支,然后我pull了下来,那我本地到底有分支这个说法吗?我本地的分支是不是就是那个远程新建的分支?

    答:你远程新建了一个分支拉到本地的道理是一样的,属于复制了一份,但是本地分支和远程分支已经是两个东西了

  3. 本地仓库和本地分支有什么区别?

    答:本地分支属于本地仓库里,是包含关系,一个仓库里可以有很多分支

  4. commit是提交到本地仓库,然后push,这个push是把所有代码推到远程仓库,还是只是把commit的地方推到远程仓库?

    答:肯定不会全量推送到远程的,是通过对比 commit 的记录,如果本地高于远程就直接把多出来的commit 给怼上去,如果本地分支的最新版本和远程的 commit 有冲突,就需要解决冲突。

  5. 那为什么要先commit,然后pull,然后再push,我pull了,岂不是把自己改的代码都给覆盖掉了嘛,因为远程没有我改的代码,我pull,岂不是覆盖了我本地的改动好的地方了?那我还怎么push?

    答:这个先 commit 再 pull 最后再push 的情况就是为了应对多人合并开发的情况,

    • commit 是为了告诉 git 我这次提交改了哪些东西,不然你只是改了但是 git 不知道你改了,也就无从判断比较;

    • pull是为了本地 commit 和远程commit 的对比记录,git 是按照文件的行数操作进行对比的,如果同时操作了某文件的同一行那么就会产生冲突,git 也会把这个冲突给标记出来,这个时候就需要先把和你冲突的那个人拉过来问问保留谁的代码,然后在 git add && git commit && git pull 这三连,再次 pull 一次是为了防止再你们协商的时候另一个人给又提交了一版东西,如果真发生了那流程重复一遍,通常没有冲突的时候就直接给你合并了,不会把你的代码给覆盖掉

    • 出现代码覆盖或者丢失的情况:比如A B两人的代码pull 时候的版本都是1,A在本地提交了2,3并且推送到远程了,B 进行修改的时候没有commit 操作,他先自己写了东西,然后 git pull 这个时候 B 本地版本已经到3了,B 在本地版本3的时候改了 A 写过的代码,再进行了git commit && git push 那么在远程版本中就是4,而且 A 的代码被覆盖了,所以说所有人都要先 commit 再 pull,不然真的会覆盖代码的

  6. 两个分支A和B,A合并B和B合并A,有区别吗?

答:两个互相合并的唯一区别就是 A->B 的时候 B 分支上会产生一个 merge_commit ,被改变的分支是 B ;如果现在没有发生任何改动执行 B->A ,则A和B两分支才会完全相同。

4.git的整个执行流程★★★

  1. 有时候我们开发需要开一个分支,这样可以有效的并行开发,开分支有两种方式:

    • 一种是在远程开好分支,本地直接拉下来(推荐:根据具体issue,创建相应的分支)
    • 一种是本地开好分支,推送到远程
  2. git clone目标仓库

  3. git checkout -b feature-branch origin/feature-branch

    检出远程的feature-branch分支到本地,创建与远程仓库同名的本地仓库

  4. git branch

    检查当前分支是否切换的目标分支

  5. 轻微修改代码提交测试一下

    看是否能够提交成功,以免白做了

  6. 提交测试通过后,正式开始写代码

  7. git status 检查当前仓库状态

  8. 先commit,然后pull,最后再push


 评论

联系我 | Contact with me

Copyright © 2019-2020 谁知你知我,我知你知深。此恨经年深,比情度日久

博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议