【git】git操作命令和相关脚本

目录

git clone

git checkout

git diff

git add

git pull --rebase

git pull 

git fetch

git reset

git stash 

git clean 

git cherry-pick

git merge     

git log

git tag

git blame

报错处理

相关脚本

git clone

git clone [远程仓库地址]            #clone下来保持原文件夹名

git clone [远程仓库地址]  [想要重命名的文件夹名称]  #clone重命名的文件夹名称

git checkout

git checkout迁出一个分支的特定版本。默认是迁出分支的HEAD版本


一此用法示例:

$ git checkout  master            #//取出master版本的head。

$ git checkout  tag_name         #//在当前分支上 取出 tag_name 的版本

$ git checkout  master file_name  #//放弃当前对文件file_name的修改

$ git checkout  commit_id  file_name  #//取commit_id提交版本的file_name

$ git checkout -b dev/1.5.4 origin/dev/1.5.4

# 从远程dev/1.5.4分支取得到本地分支/dev/1.5.4

$ git checkout -- hello.rb

#这条命令把hello.rb从HEAD中签出.

$ git checkout .

#这条命令把 当前目录所有修改的文件 从HEAD中签出并且把它恢复成未修改时的样子.

#注意:在使用 git checkout 时,如果其对应的文件被修改过,那么该修改会被覆盖掉。

https://www.yiibai.com/git/git_checkout.html 


git diff

git diff 忽略文件权限被修改的文件

不同场景的解决方法
让当前git库忽略掉文件权限检查
git config core.fileMode false
1
针对repo库可用如下命令解决
repo forall -c git config core.fileMode false
1
当前user全局设置忽略文件权限检查,可查看文件~/.gitconfig
git config --global core.fileMode false // 所有版本库
$ cat ~/.gitconfig 
[user]
    name = huping
    email = [email protected]
[http]
    postBuffer = 524288000
[core]
    compression = -1
    fileMode = false
[color]
    ui = auto
原文链接:https://blog.csdn.net/hp370440182/article/details/89278340

git add

git add -u <==> git add –update
提交所有被删除和修改的文件到数据暂存区

git add .
提交所有修改的和新建的数据暂存区

git add -A <==>git add –all
提交所有被删除、被替换、被修改和新增的文件到数据暂存区

  • git add -A 提交所有变化
  • git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
  • git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件

git版本不同会有所区别:

【git】git操作命令和相关脚本_第1张图片

【git】git操作命令和相关脚本_第2张图片
链接:https://www.jianshu.com/p/65fb3fa62057

【git】git操作命令和相关脚本_第3张图片


git pull --rebase

git pull                 =  git fetch + git merge  FETCH_HEAD 
git pull --rebase =  git fetch + git rebase FETCH_HEAD 

差距就在git fetch之后的操作:

现在来看看git merge和git rebase的区别。

rebase的好处是避免了菱形的产生,保持提交曲线为直线:

在master执行git merge test,然后会得到如下结果:

       D--------E
      /          \
 A---B---C---F----G---   test, master
在master执行git rebase test,然后得到如下结果:

A---B---D---E---C‘---F‘---   test, master
详细说明:https://blog.csdn.net/bandaoyu/article/details/121507096

git pull 

一般更推荐git pull --rebase,详情见git pull --rebase

git pull 将远程主机的最新内容拉下来到本地工作目录后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。

git pull 的过程可以理解为:

git fetch origin master       //从远程主机的master分支拉取最新内容 

git merge FETCH_HEAD    //将拉取下来的最新内容合并到当前所在的分支中

即将远程主机的某个分支的更新取回,并与本地指定的分支合并,完整格式可表示为:

$ git pull  <远程主机名>  <远程分支名>:<本地分支名>

如果远程分支是与当前分支合并,则冒号后面的部分可以省略:

$ git pull origin next

//查询当前远程的版本

$ git remote -v

//直接拉取并合并最新代码

$ git pull origin master [示例1:拉取远端origin/master分支并合并到当前分支]

$ git pull origin dev [示例2:拉取远端origin/dev分支并合并到当前分支]

原文:https://blog.csdn.net/hanchao5272/article/details/79162130 

<<<<<<< HEAD

本地代码

=======

拉下来的代码

>>>>>>>


git fetch

git fetch将远程主机的最新内容拉到本地仓,用户在检查了以后决定是否合并到本地工作本目录

$ git fetch  <远程主机名>  //这个命令将某个远程主机的更新全部取回本地

$ git fetch  <远程主机名>  <分支名>取回特定分支的更新,可以指定分支名

$ git fetch  origin  master  最常见的命令如取回origin 主机的master 分支

取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,我们可以在本地通过它查看刚取回的更新信息:

$ git log -p FETCH_HEAD

git fetch后的合并:


git reset

reset命令有3种方式:

1:git reset –soft:回退到某个版本,只回退(撤销)commit,不会(撤销)add。如果还要提交,直接commit即可

2:git reset –mixed:此为默认方式,不带任何参数的git reset,即回退(撤销)commit和add,工作区不变。

3:git reset –hard:彻底回退到某个版本,撤销commit、add、和工作区修改,本地的源码也会变为上一个版本的内容(危险)

【git】git操作命令和相关脚本_第4张图片

【git】git操作命令和相关脚本_第5张图片

git reset HEAD
什么都不会发生, 指针指向当前位置

git reset --soft HEAD~1
让历史区与指定的提交保持一致,可以理解为撤销 git commit

git reset --mixed HEAD~1
HEAD~1 指上一个提交, HEAD~2 指上上一个提交
让暂存区和历史区与指定的提交保持一致,可以理解为撤销 git add

git reset --hard HEAD~1
让工作区、暂存区和历史区都与指定的提交保持一致,可以理解为撤销所有改动

(如何恢复因为误操作git reset --hard 删掉当前代码_https://blog.csdn.net/hourgtester/article/details/104779158)
链接:https://www.jianshu.com/p/e84283d2f0f1

#回退所有内容到上一个版本

git reset HEAD^

#回退a.py这个文件的版本到上一个版本

git reset HEAD^ a.py

#向前回退到第3个版本

git reset –soft HEAD~3

#将本地的状态回退到和远程的一样

git reset –hard origin/master

#回退到某个版本

git reset 057d

#回退到上一次提交的状态,按照某一次的commit完全反向的进行一次commit

git revert HEAD

如果我们某次修改了某些内容,并且已经commit到本地仓库,而且已经push到远程仓库了

这种情况下,我们想把本地和远程仓库都回退到某个版本,该怎么做呢?

前面讲到的git reset只是在本地仓库中回退版本,而远程仓库的版本不会变化

这样,即时本地reset了,但如果再git pull,那么,远程仓库的内容又会和本地之前版本的内容进行merge

这并不是我们想要的东西,这时可以有2种办法来解决这个问题:

1:直接在远程server的仓库目录下,执行git reset –soft 10efa来回退。注意:在远程不能使用mixed或hard参数

2:在本地直接把远程的master分支给删除,然后再把reset后的分支内容给push上去,如下:

#新建old_master分支做备份

git branch old_master

#push到远程

git push origin old_master:old_master

#本地仓库回退到某个版本

git reset –hard bae168

#删除远程的master分支

git push origin :master

#重新创建master分支

git push origin master

在删除远程master分支时,可能会有问题,见下:

$ git push origin :master

error: Bydefault, deleting the current branch is denied, because the next

error:'git clone' won't result in any file checked out, causing confusion.

error:

error: You can set'receive.denyDeleteCurrent'configuration variable to

error:'warn' or 'ignore'in the remote repository to allow deleting the

error: current branch, with or without a warning message.

error:

error: To squelchthis message, you can set it to 'refuse'.

error: refusing to delete the current branch: refs/heads/master

To [email protected]:gitosis_test![remote rejected] master (deletion of the current branch prohibited)

error: failed to push some refs to'[email protected]:gitosis_test'

这时需要在远程仓库目录下,设置git的receive.denyDeleteCurrent参数

git receive.denyDeleteCurrent warn

然后,就可以删除远程的master分支了

虽然说有以上2种方法可以回退远程分支的版本,但这2种方式,都挺危险的,需要谨慎操作……

相关资源:Git恢复之前版本的两种方法reset、revert(图文详解)_gitrevert后...

原文链接:https://blog.csdn.net/weixin_39569753/article/details/111554567
————————————————
版权声明:本文为CSDN博主「bandaoyu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bandaoyu/article/details/94420488

git stash 

常用git stash命令:

(1)git stash save "save message"  : 执行存储时,添加备注,方便查找,只有git stash 也要可以的,但查找时不方便识别。

(2)git stash list  :查看stash了哪些存储

查看stash的保存时间

git stash list --date=relative

git stash list --date=short

git stash list --date=local

(3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}

(4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show  stash@{$num}  -p ,比如第二个:git stash show  stash@{1}  -p

(5)git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1} 

(6)git stash pop :

命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}

用git stash pop 一旦出现冲突,git会认为stash没有结束,导致git stash list 中的列表依然存在实际已经pop出过的记录。

处理的方式:丢弃对应的记录:git stash drop  如果不加stash编号,默认的就是删除最新的,也就是编号为0的那个

(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储

(8)git stash clear :删除所有缓存的stash

git stash list

git stash show

git stash show -p

git stash show -p stash@{1}

 git 删除stash

git stash drop stash@{0} 

git clean 

删除git库中untracked files(未监控)的文件

# 删除 untracked files

git clean -f       

git  clean  -f                  #将所有untracked file 一次性删除

# 删除 untracked files和目录(d)也一起删掉
git clean -fd   

# 删除当前目录下所有没有track过的文件. 不管他是否是.gitignore文件里面指定的文件夹和文件
# 连 gitignore 的untrack 文件/目录也一起删掉 (慎用,一般这个是用来删掉编译出来的 .o之类的文件用的)

git clean -xf     #文件
git clean -xfd   #文件/目录也一起删掉

 
# 在用上述 git clean 前,强烈建议加上 -n 先看看会删掉哪些文件,n是一次clean的演习, 告诉你哪些文件会被删除. 他不会真正的删除文件, 只是一个提醒
git clean -nxfd
git clean -nf
git clean -nfd


原文链接:https://blog.csdn.net/RonnyJiang/article/details/53507306

注意:

不加上x参数,是不会删除被ignore的文件或目录的。但是如果你在.gitignore文件中对目录的描述是dir/*那么很抱歉,这个目录及里面的文件也会被清除掉。即使该目录的确是被git所忽略的。

usage: git clean [-d] [-f] [-n] [-q] [-x | -X] [--] ...
 
    -q, --quiet           be quiet(静默删除,只会告诉你出错信息。如果是成功删除了文件或目录则保持沉默)
    -n, --dry-run         dry run(告诉你会被删除的文件或目录有哪些,删除文件毕竟是一件严肃的事,在执行该命令前请务必加上该参数先确定下)
    -f, --force           force(强制删除,clean.requireForce默认的值是true。这种情况下只有加上该参数才能删除)
    -d                    remove whole directories(删除的范围是整个目录)
    -x                    remove ignored files, too(即使是被添加进gitignore的文件或目录也删掉。这里有坑,下面说~)
    -X                    remove only ignored files(只删除被添加进gitignore的文件或目录)

git reset --hard和git clean -f是一对好基友. 结合使用他们能让你的工作目录完全回退到最近一次commit的时候

git clean对于刚编译过的项目也非常有用. 如, 他能轻易删除掉编译后生成的.o和.exe等文件. 这个在打包要发布一个release的时候非常有用

下面的例子要删除所有工作目录下面的修改, 包括新添加的文件. 假设你已经提交了一些快照了, 而且做了一些新的开发

git reset --hard

git clean -df


链接:https://www.jianshu.com/p/0b05ef199749

git cherry-pick

(https://blog.csdn.net/qq_27346503/article/details/109117936)

将某个commit 拉到本分支

$ git cherry-pick

将某几个commit 拉到本分支(转移多个提交)

列出commit list

git cherry-pick   将 A 和 B 两个提交应用到当前分支。

区间表示

git cherry-pick A^..B

git cherry-pick [commit_id0^,commit_idn]

转移从 A到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。

git cherry-pick A..B

git cherry-pick (commit_id0,commit_idn]

 转移从 A(不含) 到 B 的所有提交。它们必须按照正确的顺序放置:提交 A 必须早于提交 B,否则命令将失败,但不会报错。

如果原始提交是一个合并节点,来自于两个分支的合并,那么 Cherry pick 默认将失败,因为它不知道应该采用哪个分支的代码变动。

-m配置项告诉 Git,应该采用哪个分支的变动。它的参数parent-number是一个从1开始的整数,代表原始提交的父分支编号。

git cherry-pick -m 1

上面命令表示,Cherry pick 采用提交commitHash来自编号1的父分支的变动。

一般来说,1号父分支是接受变动的分支(the branch being merged into),2号父分支是作为变动来源的分支(the branch being merged from)。

代码冲突

如果操作过程中发生代码冲突,Cherry pick 会停下来,让用户决定如何继续操作。

(1)--continue

用户解决代码冲突后,第一步将修改的文件重新加入暂存区(git add .),第二步使用下面的命令,让 Cherry pick 过程继续执行。

$ git cherry-pick --continue

(2)--abort

发生代码冲突后,放弃合并,回到操作前的样子。

(3)--quit

发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。

转移到另一个代码库

Cherry pick 也支持转移另一个代码库的提交,方法是先将该库加为远程仓库。

$ git remote add target git://gitUrl

上面命令添加了一个远程仓库target

然后,将远程代码抓取到本地。

$ git fetch target

上面命令将远程代码仓库抓取到本地。

接着,检查一下要从远程仓库转移的提交,获取它的哈希值。

$ git log target/master

最后,使用git cherry-pick命令转移提交。

$ git cherry-pick

git merge     

方式1:

#把master的megre到feature

git  checkout  feature
git  merge      master

【git】git操作命令和相关脚本_第6张图片

merge合并的优点:

  • 自动创建一个新的commit,记录了真实的commit情况,方便查看记录
  • 如果合并遇到冲突,仅需要修改后重新commit即可

merge的缺点:就是每次合并都会产生一个新的commit, 所以在使用一些git的 GUI工具,特别是commit比较频繁时,就会看到分支线很杂乱。这时如果有问题需要查找就会很困难。

方式2:

#把master的rebase到feature,就是把master的commit安插到feature线上

git  checkout  feature
git  rebase     master

【git】git操作命令和相关脚本_第7张图片

git merge和rebase合并分支的区别:https://www.cnblogs.com/shenjp/p/14437454.html

如上图所示,rebase的特点:

  • 改变当前分支从master上拉出分支
  • 没有多余的合并历史记录,并且合并后的commit顺序不一定按照commit的提交时间排序
  • 可能会多次解决同一个地方的冲突
  • 提交记录更干净,master上每个commit点都是相对独立完整的功能点

假如我们在rebase的过程中遇到了冲突,我们在解决冲突之后,需要执行:

1. git add

2.  git rebase --continue 来继续变基的操作。

3. 如果执行第二步无效,那么可以执行 git rebase --skip

注意:不要执行完 git add 之后执行 git commit

git分支合并:https://www.cnblogs.com/alice-cj/p/11300652.html

git log

逆序  git log --reverse

git log 来显示 commit date 而不是 author date 

 git log --pretty = fuller - 这会显示两个日期。如果您只想查看一个日期,但将其作为提交日期,则可以使用 git log --format =< some stuff> 。用于定义格式的所有允许代码均记录在 git help log 。提交日期是%cd %cD %cr ,%ct %ci 

git log --since='2021-05-21' --until='2021-05-28'

@Git查询一定时间范围团队代码提交日志


git log --since='2021-05-21' --until='2021-05-28' --format='%aN' | sort -u | while read name; do echo -en "$name,"; git log --since='2021-05-21' --until='2021-05-28' --author="$name" --numstat --pretty=tformat: --no-merges | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines, %s, removed lines, %s, total lines, %s\n", add, subs, loc }' -; done >> 21_05_28_code.csv;


since定义其实时间,until定义结束时间。
原文链接:https://blog.csdn.net/m0_43383623/article/details/119342633

git tag


查看本地的tag          git tag

在本地打一个tag      git tag   1-25       

删除本地tag             git tag   -d  1 25

创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。

如果要推送某个标签到远程,使用命令 git push origin 1-25

推送多个本地tag至远程 git push origin --tags

删除tag,已经推送至远程的,可以先删除本地的,再删除远程的 git push origin :refs/tags/1-25

删除tag 或者使用: git push origin :111

切换到某个tag对应的代码:git checkout
原文链接:https://blog.csdn.net/qq_37304462/article/details/113159241

git blame

查看某一行代码的修改历史:谁修改的git blame
查看某行代码谁写的:

git blame file_name
git blame -L 58,100 file_name  # 58~100   行代码
git blame -L 58,+20 file_name  # 58~58+20 行代码
其输出格式为:

commit_ID | 代码提交作者 | 提交时间 | 代码位于文件中的行数 | 实际代码 

报错处理

【GIT】git 错误记录;https://blog.csdn.net/bandaoyu/article/details/115550048

相关脚本

git status |grep  "modified"|awk  '{print $3}'|args -I {}  git add {}

git常用操作(branch tag)https://blog.csdn.net/zack_liu/article/details/112467635

你可能感兴趣的:(git,github)