Fork me on GitHub

Git| 常用操作

 

 

1. Git常用操作

1.1 重命名文件

  git mv xx  xx.md
  git commit -m"fix" or -am  (省略了git add xx; -m 添加到暂缓区; -am 是工作区的东西直接添加到版本历史库中。)

1.2 git log查看版本历史演进

查看版本历史演变,命令行的方式:
$ git branch -av (查看本地有几个分支,标*的为当前分支; 或 git branch -v )
master 5d68858 LRULinkedList
* temp f343d20 fix .md
git checkout -b tmp 5f4ac38.. (创建叫tmp的本地分支)
git log (查看当前分支的版本演进历史) git log
--all (查看所有分支的版本演进历史) git log --all --graph (图形化方式展示所有分支的commit 版本演进历史) git log --oneline (简洁地查看每次变更commit的列表; git log -n4 --oneline 查看最近的4个commit) git log --oneline -all (查看所有分支的演进历史) git log --oneline -all -n4 --graph 所有分支最近4个 git log --oneline tmp 查看具体某个分支 git log -n4 git log -n2 --oneline

git help --web log (通过浏览器的方式查看git的命令)

可以通过图形化界面的工具如: gitk

1.3 .git目录

$ cd .git
$ ls -al
drwxr-xr-x 1 Administrator 197121     0 Sep 18 00:06 .
drwxr-xr-x 1 Administrator 197121     0 Sep 17 23:56 ..
-rw-r--r-- 1 Administrator 197121     8 Sep 18 00:06 COMMIT_EDITMSG
-rw-r--r-- 1 Administrator 197121   108 Sep 17 20:53 FETCH_HEAD
-rw-r--r-- 1 Administrator 197121    21 Sep 18 00:01 HEAD
-rw-r--r-- 1 Administrator 197121    41 Sep 17 20:53 ORIG_HEAD
-rw-r--r-- 1 Administrator 197121   366 Jun  6 15:10 config
-rw-r--r-- 1 Administrator 197121    73 Jun  5 15:09 description
drwxr-xr-x 1 Administrator 197121     0 Jun  5 15:09 hooks
-rw-r--r-- 1 Administrator 197121 27672 Sep 18 00:06 index
drwxr-xr-x 1 Administrator 197121     0 Jun  5 15:09 info
drwxr-xr-x 1 Administrator 197121     0 Jun  5 15:09 logs
drwxr-xr-x 1 Administrator 197121     0 Sep  7 23:46 objects
-rw-r--r-- 1 Administrator 197121   107 Jun  5 15:09 packed-refs
drwxr-xr-x 1 Administrator 197121     0 Jun 22 22:27 refs

1. HEAD文件 $
cat HEAD ref: refs/heads/temp (这里是一个引用,指向temp的分支,说明正在工作的分支为temp分支;切换分支后它的指向引用也会随之改变。) $ git branch -av master 5d68858 LRULinkedList * temp f343d20 fix .md 带*表示正在工作的分支, HEAD表示现在正在工作在哪个分支上, HEAD是一个引用, 它指向哪个工作的分支 ------------------------------------------------------------------------------------------------
2. config文件 $
cat config 跟本地相关的配置信息 [core] repositoryformatversion = 0 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [remote "origin"] url = git@github.com:kris-2018/Datastructures-Algorithms.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master [user] name = kris-2018 email = kris18@126.com -----------------------------------------------------------------------------------------------------
3. refs文件夹 $ ls refs/   heads remotes stash tags     git仓库可以有很多tags标签(里程碑,对分支打标签),     heads是分支(独立的开发空间,如前段、后端的分支等) $ cd refs/heads   master文件中存放的是这个master指针指向哪个commit
ls -al
  ...
  master
  temp
$ cat master   5d68858034eb75b1a8822de3eb53ad33e5de5abf $ git cat-file -t 5d68858034eb (git仓库存放的对象,查看它的类型)   commit
如下图,如果hash值足够标记唯一性了,短点也没关系,

      

 

 

$ ls -all
total 5
drwxr-xr-x 1 Administrator 197121  0 Jun 22 22:27 .
drwxr-xr-x 1 Administrator 197121  0 Sep 18 00:18 ..
drwxr-xr-x 1 Administrator 197121  0 Sep 18 00:06 heads
drwxr-xr-x 1 Administrator 197121  0 Jun  5 15:09 remotes
-rw-r--r-- 1 Administrator 197121 41 Jun 22 22:27 stash
drwxr-xr-x 1 Administrator 197121  0 Jun  5 15:09 tags
-------------------------------------------------------------
4. tags标签 $ cd refs/tags
/ $ ls -al total 0 drwxr-xr-x 1 Administrator 197121 0 Jun 5 15:09 . drwxr-xr-x 1 Administrator 197121 0 Jun 22 22:27 .. drwxr-xr-x 1 Administrator 197121 0 Jun 23 22:27 js01 $ cat js01 59a4b3f206d20fd51e5d5194e1fc5bae605a8b42 $ git cat-file -t 59a4b   object 27d2f8146eabcf2782e87ce445b8469cc1accc73   type commit   tag js01 $ git cat-file -
t 27d2f8146   commit tag本身有一个哈希值(ascii码标记出来的,哈希值里边包含了一个git的对象,这个对象的类型是commit)

 

--------------------------------------------------------------------------
5. objects文件夹

$ cd objects/ (如果文件比较多git会给它打包, 放在pack里边。) $ ls -al   total 724   drwxr-xr-x 1 Administrator 197121 0 Sep 24 00:14 .   drwxr-xr-x 1 Administrator 197121 0 Sep 29 21:57 ..   drwxr-xr-x 1 Administrator 197121 0 Sep 24 22:41 00   drwxr-xr-x 1 Administrator 197121 0 Sep 7 23:46 01   ...   drwxr-xr-x 1 Administrator 197121 0 Aug 18 20:58 f8   drwxr-xr-x 1 Administrator 197121 0 Aug 31 23:46 f9   drwxr-xr-x 1 Administrator 197121 0 Sep 24 22:41 fe   drwxr-xr-x 1 Administrator 197121 0 Sep 29 21:51 ff   drwxr-xr-x 1 Administrator 197121 0 Jun 5 15:09 info   drwxr-xr-x 1 Administrator 197121 0 Aug 4 23:09 pack $ cd objects/f8 $ ls -al   total 56   drwxr-xr-x 1 Administrator 197121 0 Aug 18 20:58 .   drwxr-xr-x 1 Administrator 197121 0 Sep 24 00:14 ..   -r--r--r-- 1 Administrator 197121 1130 Jun 23 23:26 1f1e5bc0de7345aaa1bac93938ec59f1035d69   -r--r--r-- 1 Administrator 197121 46 Jun 23 22:26 325e14cf2d0789d7dba36392b9a45cba6364bd   -r--r--r-- 1 Administrator 197121 315 Aug 18 20:58 491e3608fa367a54a1c4a2713dce9ddfadf227   -r--r--r-- 1 Administrator 197121 47 Jun 21 00:20 66d5cee86d85f4c1ce1f593682a0b9c9beed3e   -r--r--r-- 1 Administrator 197121 804 Jul 1 00:05 8a32fde141f921c2e59a5d940c555e35d636ea (文件 blob)   -r--r--r-- 1 Administrator 197121 206 Jul 14 22:48 add3ad4d79c24d8180efe6ed24871a6f879b67 (树 tree ) $ git cat-file -t f8add3ad4d79c24d8180efe6ed24871a6f879b67 (它的哈希值是文件名 + 上边一串; -t是查看类型, -p是查看内容)   tree $ git cat-file -p f8add3ad4d79c24d8180efe6ed24871a6f879b67   040000 tree 6a4cc24aa8031738260431419f57147332acdbc1 array   040000 tree 2eab908241e82c5413a5e568b4086eae1ede2f42 binarytree   040000 tree ff3133c99b4d11ca84046237919eaaef56ee4a6c hashtable   040000 tree a0917b45758230edda46a39afc13bcc13b525354 linkedlist   040000 tree 8c2ce211815a73689bc3245c3f62010f8482a411 queue   040000 tree 4f1a526375ef605c661898ddbae705af9f0ba7a8 stack $ git cat-file -t f88a32fde141f921c2e59a5d940c555e35d636ea   blob $ git cat-file -p f88a32fde141f921c2e59a5d940c555e35d636ea   package com.leetcode.algorithm.recursive.backtracking;       .......... dfs(nums, used, list, res); used[i] = false; list.remove(list.size() - 1);       .........
tree 文件夹
blob 是文件对象

HEAD文件,跟git checkout xxx(切换分支是一样的效果)
config (项目的配置信息)
refs (引用, 里边存的是各个分支、 tags的信息)
objects 

只要任何文件的文件内容相同,在git中都是唯一的一个blob

1.4 Git对象彼此关系

项目的管理系统变更是很频繁的,没有一套好的文件存储机制它的库会越积越大的, 性能也会越来越差,设计一个良好的存储机制对于版本控制系统是很关键的。

三个对象, commit、 tree、 blob

 

 

 

一个commit代表一棵树(一个commit只对应一棵树, 不会对应两颗树)
这颗树代表了取出某个commit, 这个commit对应了整个这个commit的视图,
视图中存放的是一个快照,当前commit对应的本项目仓库的所有的文件夹以及所有的快照(这个时间点文件夹的样子)


$ git log --oneline -n2
9334dc4 fix
0e1a5dd add

$ git cat-file -p 9334dc4
tree d03a55eb138a291b266888bce69d7f7d68f63d36
parent 0e1a5ddf78a5321d250e5f0dcb990e28f8e740fc
author kris-2018 <kris18@126.com> 1601374708 +0800
committer kris-2018 <kris18@126.com> 1601374708 +0800

fix

$ git cat-file -p d03a55eb
100644 blob c9230e8ee94241f3d01bc1925bd31d74eeaab1af    .gitignore
100644 blob d743e4554dcbdf0e220da757d6c86d531f7ef63c    README.md
100644 blob 545b0cea6f032f67e5541656243248d6e1adfc1f    pom.xml
040000 tree 10ac41422838cf0db127afd488fa9606fe0a8f59    src

$ git cat-file -p 10ac41422
040000 tree 9d3d2cbbc7127131829a2bfe36abf9b3391bf613    main

 1.5 Tree的个数

  

$ git init watch_git_objects
$ cd watch_git_objects/

$ ls -al
total 8
drwxr-xr-x 1 Administrator 197121 0 十月  1 13:42 ./
drwxr-xr-x 1 Administrator 197121 0 十月  1 13:42 ../
drwxr-xr-x 1 Administrator 197121 0 十月  1 13:42 .git/

$ mkdir doc
$ git status
On branch master
Initial commit
nothing to commit (create/copy files and use "git add" to track)

$ cd doc/
$ echo "hello world" > readme
$ cd ..
$ git status
On branch master
Initial commit
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        doc/
nothing added to commit but untracked files present (use "git add" to track)

$ find .git/objects/ -type f

$ git add doc/
$ git status
On branch master
Initial commit
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   doc/readme         
$ find .git/objects/ -type f       (新的东西加入到暂缓区, git就会把暂缓区的文件创建为blob)
.git/objects/3b/18e512dba79e4c8300dd08aeb37f8e728b8dad



$ git cat-file -t 3b18e512
blob
$ git cat-file -p 3b18e512
hello world


$ git status
On branch master
Initial commit
Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   doc/readme

$ git commit -m'add readme'
[master (root-commit) 0e2be7d] add readme
 1 file changed, 1 insertion(+)
 create mode 100644 doc/readme

$ find .git/objects/ -type f
.git/objects/0e/2be7d73c06510d84ad5b72459331aff21d2267
.git/objects/2c/5264370f2630da80ee38f412213d59657af6e8
.git/objects/3b/18e512dba79e4c8300dd08aeb37f8e728b8dad
.git/objects/f5/5a12e98ffd80349f3499cc52a06b8afb93ec90


$ git cat-file -t 0e2be7d
commit
$ git cat-file -p 0e2be7d (它里边包含了一颗树,它就是commit, 类型是commit; commit里边包含一颗tree f55a12e 它的类型也是tree)
tree f55a12e 98ffd80349f3499cc52a06b8afb93ec90
author songshengyang <190438@lifeat.cn> 1601531654 +0800
committer songshengyang <190438@lifeat.cn> 1601531654 +0800
add readme

$ git cat-file -t f55a12e
tree
$ git cat-file -p f55a12e   (它也是一颗tree, 里边装了一个blob)
040000 tree 2c52643 70f2630da80ee38f412213d59657af6e8    doc


$ git cat-file -t 2c52643
tree
$ git cat-file -p 2c52643
100644 blob 3b18e512 dba79e4c8300dd08aeb37f8e728b8dad    readme

$ git cat-file -t 3b18e512
blob
$ git cat-file -p 3b18e512
hello world


objects下面包含了4个对象, 其中有一个是commit, 一个是blob, 最后两个是tree; 

1.5 分离头指针

$ git branch -av
* master                5197707 add
  temp                  f343d20 fix .md
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 5197707 add

$ git log 

$ git checkout 9ae244fb3  //基于这个commit做一个checkout的活动//you are in 'detached HEAD' state.可以做一些变更产生commit 或者discard丢弃掉
分离头指针的含义本质上就是说我们正工作在一个没有分支的状态下, 它没有跟任何分支挂钩,当你在HEAD的状态下做了开发产生了commit,但当你切换到其他分支修复bug时,git有可能把它当垃圾给清除掉。
  如果要做变更,要根某个分支或者tag挂钩绑定,在分支的基础上,对那个分支就行变更。 
   
分离头指针的好处就是,当你想要测试某个东西时候,想要做某个变更,如果效果不好随时可以扔掉(完全不用理会,做checkout切换到其他分支即可)

$ git status
$ git commit -am"HEAD Test"
  [detached HEAD 81c8623] HEAD Test

$ git log
  commit 81c8623...(HEAD)
  Author: kris-2018 <kris18@126.com>
  Date: Thu Oct 22 07:50:40 2020 +0800
  HEAD_Test

  commit dc1850fa92fd9a5406e29425a1021be1f406655a
  Author: kris-2018 <kris18@126.com>
  Date: Mon Oct 19 18:55:58 2020 +0800
  fix

$ git checkout master
$ git branch HEAD_Test 81c8623

 

1.6 HEAD 与Branch 

git checkout -b fix_readme HEAD_Test  //创建并切换到新的分支
  HEAD不仅仅可以指代新分支的最后一次提交,同时它还可以不跟分支挂钩,处理分离头状态下,它就跟具体某个commit挂钩了。
  其次,当我们切换或者创建新分支时候,HEAD也会指向新的分支上去。

分支最后也都是要落脚到具体某个commit上的

$ git diff 81c8623af 9ae244fb3
$ git diff HEAD HEAD^

HEAD可以指代commit, 
HEAD~1 或者HEAD^1 或者HEAD^ 表它上一级,  HEAD^^(等同于HEAD~2)表它父亲的父亲;

 

删除不必要的分支
$ git branch -av
  HEAD_Test             81c8623 HEAD Test
  fix_readme            81c8623 HEAD Test
* master                4151de1 Test
  temp                  f343d20 fix .md
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 4151de1 Test

$ git branch -d HEAD_Test  //删除某个分支 
  error: The branch 'HEAD_Test' is not fully merged.
  If you are sure you want to delete it, run 'git branch -D HEAD_Test'.

$ git branch -D HEAD_Test
Deleted branch HEAD_Test (was 81c8623).


clear //清屏


修改最新commit的message:
$ git branch -av
* master                4151de1 Test
  temp                  f343d20 fix .md
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 4151de1 Test

$ git log -n1
commit 4151de1b08562024eaa830380a76bab01b7acad6
Author: kris-2018 <kris18@126.com>
Date:   Thu Oct 22 07:50:40 2020 +0800
    Test

$ git commit --amend  //修改最新一次提交的commit内容 
[master e6a4c32] Test Java
 Date: Thu Oct 22 07:50:40 2020 +0800
 1 file changed, 3 deletions(-)

$ git log -n1
commit e6a4c3294e33f5b8fc599daa0a44ca3bbf3d14d3
Author: kris-2018 <kris18@126.com>
Date:   Thu Oct 22 07:50:40 2020 +0800
    Test Java


如何修改老旧的commit内容    
$ git log -3
commit e6a4c3294e33f5b8fc599daa0a44ca3bbf3d14d3
Author: kris-2018 <kris18@126.com>
Date:   Thu Oct 22 07:50:40 2020 +0800
    Test Java

commit 5197707c4888dab8133395ba76672d64893ecb86
Author: kris-2018 <kris18@126.com>
Date:   Thu Oct 22 00:13:56 2020 +0800
    add

commit dc1850fa92fd9a5406e29425a1021be1f406655a
Author: kris-2018 <kris18@126.com>
Date:   Mon Oct 19 18:55:58 2020 +0800
    fix

$ git  rebase -i dc1850fa92  //要对第二个commit(即add的commit的内容做变更)的内容做变更,它的base应该是它的上一个节点 
pick 5197707 add  --改为--> reword 5197707 add 
pick e6a4c32 Test Java

# Rebase dc1850f..e6a4c32 onto dc1850f (2 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# 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

:wq! //保存并退出    

弹出-->
add linkedlist2 (修改编辑即可)

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Thu Oct 22 00:13:56 2020 +0800
#
# interactive rebase in progress; onto dc1850f
# Last command done (1 command done):
#    reword 5197707 add
# Next command to do (1 remaining command):
#    pick e6a4c32 Test Java
# You are currently editing a commit while rebasing branch 'master' on 'dc1850f'.
#
# Changes to be committed:
#       modified:   src/main/java/com/leetcode/datastructure/linkedlist/LeetCode21MergeTwoSortedLists.java
#       modified:   src/main/java/com/leetcode/datastructure/linkedlist/LeetCode24SwapNodesInPairs.java
#
:wq! //保存并退出
$ git  rebase -i dc1850fa92
[detached HEAD 249101b] add linkedlist2
 Date: Thu Oct 22 00:13:56 2020 +0800
 2 files changed, 38 insertions(+), 13 deletions(-)
Successfully rebased and updated refs/heads/master.

$ git branch -av
* master                9568c74 [ahead 2, behind 2] Test Java
  temp                  f343d20 fix .md
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 4151de1 Test

$ git log -n3
commit 9568c74981baa626bbde1b076caf381056eb6511
Author: kris-2018 <kris18@126.com>
Date:   Thu Oct 22 07:50:40 2020 +0800
    Test Java

commit 249101b746d9e2c603f5957f2d613dd9af48a2e4
Author: kris-2018 <kris18@126.com>
Date:   Thu Oct 22 00:13:56 2020 +0800
    add linkedlist2

commit dc1850fa92fd9a5406e29425a1021be1f406655a
Author: kris-2018 <kris18@126.com>
Date:   Mon Oct 19 18:55:58 2020 +0800
    fix

 

$ git branch -a //查看远程分支
$ git branch //查看本地分支
$ git branch develop //本地创建develop分支
$ git push origin develop //将本地develop分支推到远程

$ git checkout develop
Switched to branch 'develop'

 

$ git push
fatal: The current branch develop has no upstream branch.
To push the current branch and set the remote as upstream, use

git push --set-upstream origin develop

 

$ git push --set-upstream origin develop
Enumerating objects: 29, done.



 

怎样把连续的多个commit整理成1个
$ git log -n5
commit 9568c74981baa626bbde1b076caf381056eb6511
Author: kris-2018 <kris18@126.com>
Date:   Thu Oct 22 07:50:40 2020 +0800
    Test Java

commit 249101b746d9e2c603f5957f2d613dd9af48a2e4
Author: kris-2018 <kris18@126.com>
Date:   Thu Oct 22 00:13:56 2020 +0800
    add linkedlist2

commit dc1850fa92fd9a5406e29425a1021be1f406655a
Author: kris-2018 <kris18@126.com>
Date:   Mon Oct 19 18:55:58 2020 +0800
    fix

commit 31c6ece3ce5bb29a8a91c55574fc262387127bbc
Author: kris-2018 <kris18@126.com>
Date:   Mon Oct 19 00:24:54 2020 +0800
    array

commit 9ae244fb3443ffee41e70a9c9ca005e822b03cb0
Author: kris-2018 <kris18@126.com>
Date:   Sat Oct 10 17:56:37 2020 +0800
    fix

$ git rebase -i 9ae244fb3443
pick 31c6ece array
pick dc1850f fix                --> squash dc1850f fix
pick 249101b add linkedlist2    --> squash 249101b add linkedlist2
pick 9568c74 Test Java
:wq!

# This is a combination of 3 commits.
# The first commit's message is:
array -- 3
# This is the 2nd commit message:
fix
# This is the 3rd commit message:
add linkedlist2
:wq!
$ git rebase -i 9ae244fb3443
[detached HEAD 97e557d] array -- 3 fix add linkedlist2
 Date: Mon Oct 19 00:24:54 2020 +0800
 6 files changed, 141 insertions(+), 41 deletions(-)
Successfully rebased and updated refs/heads/master.

$ git log -n5
commit 0cf510be049b8632d2fc3b4013ff8cf387f5aca0
Author: kris-2018 <kris18@126.com>
Date:   Thu Oct 22 07:50:40 2020 +0800
    Test Java

commit 97e557d98998d21c4092165f7745bc735d9fab09
Author: kris-2018 <kris18@126.com>
Date:   Mon Oct 19 00:24:54 2020 +0800
    array -- 3
    fix
    add linkedlist2

commit 9ae244fb3443ffee41e70a9c9ca005e822b03cb0
Author: kris-2018 <kris18@126.com>
Date:   Sat Oct 10 17:56:37 2020 +0800
    fix

commit a94c95d8f369b501ef1bc3ba8d4690fa34015a28
Author: kris-2018 <kris18@126.com>
Date:   Wed Sep 30 17:41:52 2020 +0800
    fix

commit 3fc9e1a5da70d2f2dc349a690026e8f0ef056e74
Author: kris-2018 <kris18@126.com>
Date:   Wed Sep 30 08:37:58 2020 +0800
    add


怎么把间隔的几个commit合并成1个 ?
$ git log -n5 --graph
* commit 0cf510be049b8632d2fc3b4013ff8cf387f5aca0
| Author: kris-2018 <kris18@126.com>
| Date:   Thu Oct 22 07:50:40 2020 +0800
|     Test Java
|
* commit 97e557d98998d21c4092165f7745bc735d9fab09
| Author: kris-2018 <kris18@126.com>
| Date:   Mon Oct 19 00:24:54 2020 +0800
|     array -- 3
|     fix
|     add linkedlist2
|
* commit 9ae244fb3443ffee41e70a9c9ca005e822b03cb0
| Author: kris-2018 <kris18@126.com>
| Date:   Sat Oct 10 17:56:37 2020 +0800
|     fix
|
* commit a94c95d8f369b501ef1bc3ba8d4690fa34015a28
| Author: kris-2018 <kris18@126.com>
| Date:   Wed Sep 30 17:41:52 2020 +0800
|     fix
|
* commit 3fc9e1a5da70d2f2dc349a690026e8f0ef056e74
| Author: kris-2018 <kris18@126.com>
| Date:   Wed Sep 30 08:37:58 2020 +0800
|     add

 

 
posted @ 2020-09-30 23:16  kris12  阅读(187)  评论(0)    收藏  举报
levels of contents