目录
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版本不同会有所区别:
链接:https://www.jianshu.com/p/65fb3fa62057
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 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
区间表示
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
merge合并的优点:
- 自动创建一个新的commit,记录了真实的commit情况,方便查看记录
- 如果合并遇到冲突,仅需要修改后重新commit即可
merge的缺点:就是每次合并都会产生一个新的commit, 所以在使用一些git的 GUI工具,特别是commit比较频繁时,就会看到分支线很杂乱。这时如果有问题需要查找就会很困难。
方式2:
#把master的rebase到feature,就是把master的commit安插到feature线上
git checkout feature
git rebase master
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