Git学习

与SVN的区别

git为分布式相对于svn为集中式,git可以很容易的创建分支,克隆文本代码,离线也可现在本地分支提交修改。

但是git相对于svn要记住很多命令,入门相对复杂。

四度空间

在Git仓库目录下的文件改动(增删改操作)共有如下4个空间来记录/存储,Git命令就是用于将文件改动切换到不同的空间来记录。

  • Workspace:工作区
  • Index / Stage / Cached:暂存区
  • Repository:本地仓库
  • Remote:远程仓库

Git学习_2020-12-01-13-53-26.png

四种状态

对应四度空间,处于这四种空间的文本有着4种状态来标识:

  • Untracked:新增的文件的状态,未受Git管理,记录在工作区
  • Modified:受Git管理过的文件的改动状态(包括改动内容、删除文件),记录在工作区
  • Staged:将记录在工作区的文件变动状态通知了Git,记录在暂存区
  • Unmodified:受Git管理中的文件状态(没有变动),记录在本地仓库/远程仓库

连接

初始化:

git init

添加远程仓库:

git remote add origin “url”

生成公钥:

ssh-keygen -t rsa

cat ~/.ssh/id_rsa.pub 添加到github配置

查看配置列表:

git config –local –list

克隆远程分支:

git clone “url”

文件加入暂存区:

git add

提交到本地分支:

git commit -m “注释”

推送到远程仓库:

git push -u origin master

过滤

touch .gitignore

1
2
3
/project/demo.o       #过滤具体文件demo.o
/project/settings/ #过滤整个settings文件夹
*.o #过滤所有.o文件
  • 以斜杠“/”开头表示目录
  • 以星号“*”通配多个字符
  • 以问号“?”通配单个字符
  • 以方括号“[]”包含单个字符的匹配列表
  • 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录

变动

查看文件改动状态:

git status

查看文件具体改动:

git diff file

查看暂存区的改动:

git diff –cached

查看工作区与本地仓库的改动:

git diff HEAD file

查看历史变更:

git diff commitID1 commitID2

查看本地分支与远程分支的改动

git diff origin/master..master

转移

添加文件到暂存区:

git add file

git add -A /app

git add *

将文件退回工作区:

git rm –cache file

直接删除:

git rm -f file

文件重命名:

git mv fileold filenew

文件移动位置:

git mv [src file] [dir]

提交

将暂存区内容提交:

git commit -m “注释”

追加提交并修改注释:

git commit –amend -m “新注释”

将工作区和暂存区的改动一次提交到本地仓库:

git commit -a -m “注释”

补丁

将本地提交打补丁,可以交由他人继续开发:

git format-patch -1 commitID

git format-patch HEAD~3

应用补丁包:

git am 补丁包名

日志

标准日志:

git log

精简查看:

git log –pretty=oneline

完整查看:

git log -p

工具查看:

gitk

查看本地历史操作:

git reflog

缓存

缓存本地改动:

git stash save -a “add test stash0()”

查看所有缓存:

git stash list

查看缓存细节:

git stash show -p stash@{1}

启动某个缓存:

git stash pop stash@{1}

丢弃某个缓存:

git stash drop stash@{1}

清空缓存:

git stash clear

回退

回退到某个版本,只回退了commit的信息,不会恢复到index file一级:

git reset –-soft

彻底回退到某个版本,本地的源码也会变为上一个版本的内容,撤销的commit中所包含的更改被冲掉:

git reset -–hard

回退到某个版本,回退了commit的信息及暂存区的回退,工作区不回退

git reset –mixed

清理

撤销不能管理到未加入到git的文件,这时需要git clean配合。

git reset –hard

git clean -df

这样可以做到完全清理。

撤销

撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销作为一次最新的提交。

撤销前一次 commit:

git revert HEAD

撤销前前一次 commit:

git revert HEAD^

撤销指定的版本:

git revert commit

分支

查看分支:

git branch

创建分支:

git branch

切换分支:

git checkout 或者git switch

创建+切换分支:

git checkout -b 或者git switch -c

合并某分支到当前分支:

git merge

删除分支:

git branch -d

禁用Fast forward:

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

由远程分支创建本地分支:

git checkout -b branch-name origin/branch-name

建立本地分支和远程分支的关联:

git branch –set-upstream branch-name origin/branch-name

git pull/get fetch

git fetch和git pull都可以将远端仓库更新至本地,不过git pull相当于git fetch + git merge。

在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支:

git fetch origin master:tmp

来比较本地代码与刚刚从远程下载下来的代码的区别:

git diff tmp

合并temp分支到本地的master分支:

git merge tmp

如果不想保留temp分支,可以用这步删除:

git branch -d temp

挑拣

在当前分支挑其他分支的 commit,把那部分的变动那过来:

git cherry-pick commit-sha1

支持一次性拿多个:

git cherry-pick master4 master2

支持区间, 区间中间:

git cherry-pick startGitSha1..endGitSha1

  • continue:继续 pick,一般有冲突解决后才需要这样
  • skip:跳过这次进入队列下一次行为
  • abort : 完全放弃 pick,恢复 pick 之前的状态
  • quit: 未冲突的自动变更,冲突的不要,退出这次 pick

变基

整个功能开发完毕的时侯,会有非常多的 commit,用 rebase 可以让我们的commit记录很干净。

带 -i 可以进入交互模式,效果如下:

git rebase -i git-sha1|branch(HEAD)

若是中间毫无冲突,变基则一步到位,否则需要逐步调整

提交变更后继续变基下一步:

git rebase –continue

引起冲突的commits会被丢弃,continue提示没有需要改动的也可以用这个跳过:

git rebase –skip

若是变基改残废了,但是走到一半,可以彻底回滚变基之前的状态:

git rebase –abort

Linux——Find(二)

前言

F i n d 是一个非常有效的工具,它可
以遍历当前目录甚至于整个文件系统来查找某些文件或目录。

表达式

F i n d 命令的一般形式为:

find pathname -options [-print -exec -ok]

让我们来看看该命令的参数:

  • pathname find命令所查找的目录路径。例如用 .来表示当前目录,用/来表示系统根目录。
  • -print find命令将匹配的文件输出到标准输出。
  • -exec find命令对匹配的文件执行该参数所给出的 s h e l l命令。相应命令的形式为 ‘ c o m m -
    and’ {} ;,注意{ }和\;之间的空格。
  • -ok 和- e x e c的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 s h e l l命令,
    在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

命令选项

find 命令有很多选项或表达式,每一个选项前面跟随一个横杠 -。让我们先来看一下该命令的主要选项,然后再给出一些例子。

  • -name 按照文件名查找文件。
  • -perm 按照文件权限来查找文件。
  • -prune 使用这一选项可以使f i n d命令不在当前指定的目录中查找,如果同时使用了 - d e p t h
    选项,那么- p r u n e选项将被f i n d命令忽略。
  • -user 按照文件属主来查找文件。
  • -group 按照文件所属的组来查找文件。
  • -mtime -n +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n
    表示文件更改时间距现在 n天以前。F i n d命令还有- a t i m e和- c t i m e选项,但它们都和- m t i m e选项相似,所以我们在这里只介绍 - m t i m e选项。
  • -nogroup 查找无有效所属组的文件,即该文件所属的组在 / e t c / g r o u p s中不存在。
  • -nouser 查找无有效属主的文件,即该文件的属主在 / e t c / p a s s w d中不存在。
  • -newer file1 ! file2 查找更改时间比文件f i l e 1新但比文件f i l e 2旧的文件。
  • -type 查找某一类型的文件,诸如:
    b - 块设备文件。
    d - 目录。
    c - 字符设备文件。
    p - 管道文件。
    l - 符号链接文件。
    f - 普通文件。
  • -size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
  • -depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
  • -fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
    / e t c / f s t a b中找到,该配置文件中包含了本系统中有关文件系统的信息。
  • -mount 在查找文件时不跨越文件系统 m o u n t点。
  • -follow 如果f i n d命令遇到符号链接文件,就跟踪至链接所指向的文件。
  • -cpio 对匹配的文件使用c p i o命令,将这些文件备份到磁带设备中。

使用name选项

不管当前路径是什么,如果想要在自己的根目录 $ H O M E中查找文件名符合 * . t x t的文件,使用作为’ p a t h n a m e参数,波浪号代表了你的$ H O M E目录。

$ find ~ -name “*.txt” -print

或:

$ find . -print

想要在当前目录及子目录中查找所有的‘ * . t x t’文件,可以用:

$ find . -name “*.txt” -print

想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:

$ find . -name “[A-Z]*” -print

想要在 /etc 目录中查找文件名以 host 开头的文件,可以用:

$ find /etc -name “host*” -print

要想让系统高负荷运行,就从根目录开始查找所有的文件。如果希望在系统管理员那里保留一个好印象的话,最好在这么做之前考虑清楚!

$ find / -name “*” -print

如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是 * . t x t的文件,下面的命令就能够返回名为 a x 3 7 . t x t的文件:

$ find . -name “[a-z][a-z][0–9][0–9].txt” -print

使用perm选项

如果希望按照文件权限模式来查找文件的话,可以采用 - p e r m选项。

为了在当前目录下查找文件权限位为 7 5 5的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:

$ find . -perm 755 -print

如果希望在当前目录下查找所有用户都可读、写、执行的文件(要小心这种情况),我们可以使用f i n d命令的- p e r m选项。在八进制数字前面要加一个横杠 -。在下面的命令中 - p e r m代表按照文件权限查找,而‘ 0 0 7’和你在c h m o d命令的绝对模式中所采用的表示法完全相同。

$ find . -perm -007 -print

忽略某个目录

可以使用- p r u n e选项来指出需要忽略的目录。在使用 - p r u n e选项时要当心,因为如果你同时使用了- d e p t h选项,那么- p r u n e选项就会被f i n d命令忽略。

如果希望在/ a p p s目录下查找文件,但不希望在 / a p p s / b i n目录下查找,可以用:

$ find /apps -name “/apps/bin” -prune -o -print

使用user和nouser选项

如果希望按照文件属主查找文件,可以给出相应的用户名。例如,在 $ H O M E目录中查找文件属主为d a v e的文件,可以用:

$ find ~ -user dave -print

在/ e t c目录下查找文件属主为u u c p的文件:

$ find /etc -user uucp -print

为了查找属主帐户已经被删除的文件,可以使用 - n o u s e r选项。

$ find /home -nouser -print

使用group和nogroup选项

就像u s e r和n o u s e r选项一样,针对文件所属于的用户组, f i n d命令也具有同样的选项,为了在/ a p p s目录下查找属于a c c t s用户组的文件,可以用:

$ find /apps -group accts -print

要查找没有有效所属用户组的所有文件,可以使用 n o g r o u p选项。下面的f i n d命令从文件系统的根目录处查找这样的文件:

$ fine/-nogroup-print

按照更改时间查找文件

如果希望按照更改时间来查找文件,可以使用 m t i m e选项。

希望在系统根目录下查找更改时间在 5日以内的文件,可以用:

$ find / -mtime -5 -print

为了在/ v a r / a d m目录下查找更改时间在3日以前的文件,可以用:

$ find /var/adm -mtime +3 -print

使用type选项

如果要在 / e t c目录下查找所有的目录,可以用:

$ find /etc -type d -print

为了在当前目录下查找除目录以外的所有类型的文件,可以用:

$ find . ! -type d -print

为了在/ e t c目录下查找所有的符号链接文件,可以用:

$ find /etc -type l -print

使用size选项

可以按照文件长度来查找文件,这里所指的文件长度既可以用块( b l o c k)来计量,也可以用字节来计量。

以字节计量文件长度的表达形式为 N c;以块计量文件长度只用数字表示即可。

为了在当前目录下查找文件长度大于 1 M字节的文件,可以用:

$ find . -size +1000000c -print

为了在/ h o m e / a p a c h e目录下查找文件长度恰好为 1 0 0字节的文件,可以用:

$ find /home/apache -size 100c -print

为了在当前目录下查找长度超过 1 0块的文件(一块等于5 1 2字节),可以用:

$ find . -size +10 -print

使用depth选项

在使用f i n d命令时,可能希望先匹配所有的文件,再在子目录中查找。使用 d e p t h选项就可以使f i n d命令这样做。这样做的一个原因就是,当在使用 f i n d命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。

在下面的例子中, f i n d命令从文件系统的根目录开始,查找一个名为 C O N . F I L E的文件。
它将首先匹配所有的文件然后再进入子目录中查找。

$ find / -name “CON.FILE” -depth -print

使用mount选项

在当前的文件系统中查找文件(不进入其他文件系统),可以使用f i n d命令的m o u n t选项。

在下面的例子中,我们从当前目录开始查找位于本文件系统中文件名以 X C结尾的文件:

$ find . -name “*.XC” -mount -print

使用cpio选项

c p i o命令可以用来向磁带设备备份文件或从中恢复文件。

find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0

使用exec或ok来执行shell命令

当匹配到一些文件以后,可能希望对其进行某些操作,这时就可以使用 - e x e c选项。

e x e c选项后面跟随着所要执行的命令,然后是一对儿 { },一个空格和一个 \,最后是一个
分号。

为了用ls -l命令列出所匹配到的文件,可以把 ls -l命令放在f i n d命令的- e x e c选项中,例如:

find . -type f -exec ls -l { } \ ;

当使用诸如m v或r m命令时,可以使用-ok 选项的安全模式。

它将在对每个匹配到的文件进行操作之前提示你。

find . -name “*.log” -mtime +5 -ok rm {} \ ;

xargs

在使用f i n d命令的- e x e c选项处理匹配到的文件时, f i n d命令将所有匹配到的文件一起传递给e x e c执行。

不幸的是,有些系统对能够传递给 e x e c的命令长度有限制,这样在 f i n d命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。

这就是x a rg s命令的用处所在,特别是与 f i n d命令一起使用。 F i n d命令把匹配到的文件传递给 x a rg s命令,而x a rg s命令每次只获取一部分文件而不是全部,不像 - e x e c选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

下面的例子在整个系统中查找内存信息转储文件 (core dump) ,然后把结果保存到/tmp/core.log 文件中:

$ find . -name “core” -print | xargs echo “” >/tmp/core.log

|