3.GIT常用命令

往仓库里面添加文件

 

将新的文件放到暂存区

git add 文件名(多个文件用空格分隔)

git commit -m '说明内容'

git commit --amend 此修改一般用于未push之前修改commit信息

网页路径:file:///Users/jinhailan/git_study/git_learning/index.html

git add -u 将当前git管理的所有文件更改的文件都提交到暂存区

git日志查看

• git log --all 查看所有分支的历史
• git log --all --graph 查看图形化的 log 地址
• git log --oneline 查看单行的简洁历史。
• git log --oneline -n4 查看最近的四条简洁历史。
• git log --oneline --all -n4 --graph 查看所有分支最近 4 条单行的图形化历史。
• git help --web log 跳转到git log 的帮助文档网页

git分离头指针的问题

HEAD不仅可以指向分支,还可以指向某一个commit

有时候写代码的时候可能会出现随意checkout 到某个分支的情况(其实这时候已经不属于任何分支)

git checkout 396bf9598b  比如这种情况

将会提示

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 396bf95 add styles.css

  

这种情况比较危险,当进行了这种头指针分离的操作后,你当前所所得更将不再于代码中的任何一个分支挂钩,如果你切换回某一个分支,那么你在头指针分离后的哪些操作在git眼里都是可以清掉的垃圾,所以如果以后还需要这种变更,最好为这个分离的头指针创建一个分支

➜  styles git:(396bf95) vim style.css
➜  styles git:(396bf95) ✗ git status
HEAD detached at 396bf95   这是提示head 没有指向任何分支,已经跟分支分离了
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   style.css

no changes added to commit (use "git add" and/or "git commit -a")

  

➜  styles git:(396bf95) ✗  git commit -am 'backgroud to green'
commit f85172276bfc0ad2a942afe820ea7f5351ac3183 (HEAD -> master, tag: rename, te[detached HEAD d0ffc33] backgroud to green

 

➜  styles git:(d0ffc33) git checkout master //如果此时,你需要切换到master分支上修改bug,会有以下提示
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  d0ffc33 backgroud to green

If you want to keep it by creating a new branch, this may be a good time
to do so with:  //注意该提示,建议你为这个分离的head创建一个分支

 git branch <new-branch-name> d0ffc33   //创建分支的命令

Switched to branch 'master' 
➜  styles git:(master) git branch fix_css d0ffc33 //按照提示查创建好分支,然后通过gitk --all命令可以从图形化界面看到已经创建了对应的分支fix_css

  

GIT  HEAD 与branch的关系

HEAD指向的就是branch 实际上最终指向的就是commit

可以通过git cat-file -t 来查看

git HEAD其他用法

可以比较当前head指向的commit和之前的commit的不同

git  diff  HEAD HEAD~1     比较本次commit和上次commit的区别

git diff  HEAD HEAD~1~1 比较本次和上上次commit的区别

1 一个节点,可以包含多个子节点(checkout 出多个分支)
2 一个节点可以有多个父节点(多个分支合并)
3 ^是~都是父节点,区别是跟随数字时候,^2 是第二个父节点,而~2是父节点的父节点
4 ^和~可以组合使用,例如 HEAD~2^2

删除没用的分支

git branch -d 分支

如果出现告警,如果我们可以控制这个风险,确实要删除,那么可以使用-D来删除

➜  git_learning git:(master) git branch -d fix_readme
error: The branch 'fix_readme' is not fully merged.
If you are sure you want to delete it, run 'git branch -D fix_readme'.

  

git branch -d branch_name:使用-d 在删除前Git会判断在该分支上开发的功能是否被merge的其它分支。如果没有,不能删除。如果merge到其它分支,但之后又在其上做了开发,使用-d还是不能删除。-D会强制删除。

GIT变基操作

尚未提交到远端服务器的commit,是可以rebase的。

git rebase -i 需要变更的前一个序列值。

git rebase工作的过程中,就是用了分离头指针。rebase意味着基于新base的commit来变更部分commits。它处理的时候,把HEAD指向base的commit,此时如果该commit没有对应branch,就处于分离头指针的状态,然后重新一个一个生成新的commit,当rebase创建完最后一个commit后,结束分离头状态,Git让变完基的分支名指向HEAD

整合几个连续的commit 内容

操作完第一步以后,后悔了不想continue了该如何操作

git rebase --abort

用法:要把第一次和做后一次跟readme有关的commit合并到一起

MacBook-Pro-de-jinhailan:git_learning jinhailan$ git log
commit fc6bd589f3ff96467b65237ab523d02e992906ab (HEAD -> master)
Author: jinhailan_local <jinhailan1234@163.com>
Date:   Mon Jan 7 15:40:02 2019 +0800

    readme readme.md

commit 95860d1c62f4b137be4681affea710a85e07e3a1
Author: jinhailan_local <jinhailan1234@163.com>
Date:   Mon Jan 7 15:03:56 2019 +0800

    create a complete web page
    add index + logo

    add styles.css

    add a js

    modify index style

commit 50447b720a9a19609286187a7abba57c5dd1dded
Author: jinhailan_local <jinhailan1234@163.com>
Date:   Mon Jan 7 14:57:02 2019 +0800

  git  rebase -i 50447b7

pick 50447b7  add reademe  将第一次的commit pick出来
s fc6bd58 要合并的 commit pick c7e25bd create a complete web page add index + logo # Rebase 50447b7..c7e25bd onto 50447b7 (2 commands) # # Commands: # p, pick <commit> = use commit # r, reword <commit> = use commit, but edit the commit message # e, edit <commit> = use commit, but stop for amending # s, squash <commit> = use commit, but meld into previous commit # f, fixup <commit> = like "squash", but discard this commit's log message # x, exec <command> = run command (the rest of the line) using shell # d, drop <commit> = remove commit # l, label <label> = label current HEAD with a name # t, reset <label> = reset HEAD to a label # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>] # . create a merge commit using the original merge commit's # . message (or the oneline, if no original merge commit was # . specified). Use -c <commit> to reword the commit message. # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # # Note that empty commits are commented out ~

  如果此时没有弹出第二个文件,可以按照提示执行git rebase --continue

继续修改文件添加 add readme.md 内容

暂存区和HEAD如何做比较

这个比较是指我将我的变更做了add操作,然后我现在想要commit,但是我想跟我当前分支上最近一次commit的内容做一下比较,看我做了什么变更的时候使用。

git diff --cache

➜  git_learning git:(master) ✗ git diff --cached
Hi,we are learning Git together.
Have a good time!
one
b
c
d
jinhailan  在readme文件末尾加上jinhailan

➜  git_learning git:(master) ✗ git add readme   添加到暂存取
➜  git_learning git:(master) ✗ git status   查看当前状态,显示修改了一个文件
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   readme

➜  git_learning git:(master) ✗ git diff --cached   对比当前暂存区和HEAD的区别,也就是当前暂群区和head指向的那一次commit的区别
diff --git a/readme b/readme
index 9b1b5bc..5c00e87 100644
--- a/readme
+++ b/readme
@@ -5,3 +5,4 @@ one
 b
 c
 d
+jinhailan

  

工作区和暂存区快照如何比较差异

git diff  后边什么都不接,默认比较工作区和暂存取的差异。

此命令比较的是工作目录(Working tree)和暂存区域快照(index)之间的差异
也就是修改之后还没有暂存起来的变化内容。

如果已经git add 添加到暂存区,就不会显示变化了

https://www.cnblogs.com/lsgxeva/p/8540485.html

 

不想保留暂存区里面的所有内容

场景:我放到暂存区很多文件了,git add 放到暂存取后,我都不想要了,想撤回到工区,恢复到跟HEAD一样

git reset HEAD  后面不接任何参数

就会把之前git add 的内容都放回工作区

恢复暂存区里面的部分内容

git  reset HEAD -- 文件名  (-- 和文件名之间有空格,也可以添加多个文件,用空格分隔)

正确删除不需要的文件

普通方法

rm 文件

git rm file_name  将删除操作放到了暂存区

git中可以直接删除文件并将变化放到暂存区

git rm file_name

原文地址:https://www.cnblogs.com/asea123/p/10237338.html