git教程与常见问题

2 篇文章 0 订阅

2024-1-1 git统计

查看命令
1.查询所有用户的提交总次数

git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r


根据时间查询次数

git log --after="2023-01-01 00:00:00" --before="2023-12-31 23:59:59" --pretty='%aN' | sort | uniq -c | sort -k1 -n -r


2.gitee统计,各用户提交行数

git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done


根据时间查询行数

git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --after="2023-01-01 00:00:00" --before="2023-12-31 23:59:59" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done


3.查看对应日期个人代码提交量
 

git log --author="$(git config --get user.name)" --since=2023-01-01 --until=2023-12-31 --pretty=tformat: --numstat | awk '{ add += $1 ; subs += $2 ; loc += $1 - $2 } END { printf "added lines: %s removed lines : %s total lines: %s\n",add,subs,loc }'

2022-08-05

git stash 挂起到本地        
git pull 拉下来        
git stash pop 本地出栈        
git status 看文件并解决冲突        
git add . 加入本地库        
git commit -m "xxx" 备注本地库        
git push origin develop 提交  

 
查询某项目提交次数:

//查询所有时间
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r

//查询某一时间段
git log --after="开始时间" --before="结束时间" --pretty='%aN' | sort | uniq -c | sort -k1 -n -r
//开始时间、结束时间格式:2023-01-01 00:00:00
git log --after='2023-01-01 00:00:00' --pretty='%aN' | sort | uniq -c | sort -k1 -n -r

常见问题:

2020.0715从远程某一分支克隆

git clone -b 分支名称 git远程仓库地址

如果不指定,默认克隆master的代码到本地仓库。

20200228 文件夹添加

添加某一个文件夹是 git add 文件夹/,添加不上可以 git add 文件夹,再不行删除git库,git init后重新添加

教程

创建版本库
1.pwd命令用于显示当前目录;通过git init命令把这个目录变成Git可以管理的仓库。 git add .是把你修改的东西添加到本地仓库,Git提交过程有3个环节:本地 本地仓库 远程 ,只有把本地修改的东西,添加到 . 目录下,表明你修改的东西,添加到了本地仓库,本地仓库如何和远程仓库建立关系?通过git push 推上去即可。

时光穿梭机
1.(版本回退)HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

2.(撤销修改)命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本;
git reset HEAD <file>可以把暂存区的修改撤销掉(unstage)。
小结:假设你不但改错了东西,还从暂存区提交到了版本库;可以回退到上一个版本。不过,这是有条件的,就是你还没有把自己的本地版本库推送到远程。
    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
    场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>,就回到了场景1,第二步按场景1操作。
    场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

Merge类命令

在冲突状态下,需要解决冲突的文件会从index打回到工作区。

1.用工具或者手工解决冲突 
2.git add 命令来表明冲突已经解决。 
3.再次commit 已解决冲突的文件。

$ git reset --hard ORIG_HEAD 用来撤销已经commit 的merge. 
$ git reset --hard HEAD 用来撤销还没commit 的merge,其实原理就是放弃index和工作区的改动。

git reset --merge ORIG_HEAD,注意其中的--hard 换成了 --merge,这样就可以避免在回滚时清除working tree

3.(删除文件)你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了,Git知道你删除了文件,因此,工作区和版本库就不一致了,
        git status命令会立刻告诉你哪些文件被删除了;另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本git checkout -- test.txt,
        其实是用版本库里的版本替换工作区的版。
        现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:$ git rm test.txt rm 然后 $ git commit -m "remove test.txt"。

远程仓库
1.添加远程库:远程库的名字就是origin,这是Git默认的叫法。要关联一个远程库,使用命令git remote add origin git@github.com:66.github/github仓库名repo-name.git。由于远程库是空的,第一次推动master分支时,加上了-u参数。(git push -u origin master)git push 实际是把当前分支master推送到远程。此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
2.从远程仓库克隆:比如新仓库的名字是gitskills,git clone git@github.com:666github/gitskills.git 就可以克隆下来

分支管理
1.创建与合并分支:git checkout -b dev 创建并切换到分支dev;  (然后可以提交工程到dev分支)
          git branch 列出所有分支;  
          git checkout master切换到master分支;  
          git merge dev 把dev分支的工程合并到master分支上
          git branch -d dev可以放心删除dev分支了
2.解决冲突:git status告诉我们冲突的文件;也可以直接在文档中查看冲突内容。
        git log --graph --pretty=oneline --abbrev-commit查看分支的合并情况.合并完之后可以删除非master分支
3.分支管理策略:master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
        你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了;
        合并分支时,加上--no-ff参数就可以用普通模式合并(git merge --no-ff -m "merge with no-ff" dev),合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
4.bug分支:git stash当前工作现场“储藏”起来,等以后恢复现场后继续工作。git status查看工作区,就是干净的,这时可以创建分支开始修复bug
       在分支上修复完bug(改完合并到主分支),继续在“储藏”的dev分支上干活,git checkout dev;git status(工作区是干净的),用git stash list查看发现工作现场还在,现在我们需要恢复它:方法一,git stash apply恢复,恢复后需要git stash drop来删除stash内容;
       方法二,git stash pop恢复的同事把stash内容也删了。再用git stash list查看就看不到stash内容了。
       你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:git stash apply stash@{0},如果不储藏你提交bug              分支内容到master时,dev分支也会被提交,储藏相当于先把dev工程隐藏了。
5.feature分支:每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
        如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。(为了防止再次变动,你也可以留着该分支,方便再用)
6.多人协作:当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。
        查看远程仓库的信息:git remote -v(如果没有推送权限,就看不到push的地址)
        推送分支:把该分支上的所有本地提交推送到远程库对应的远程分支上,git push origin master,如果推动其他分支:git push origin dev
        master主分支,要时刻与远程同步;dev分支时开发分支,团队都在上面工作,也要与远程同步;bug分支feature分支因需求而定
        抓取分支:从远程库clone时,默认情况下,你的小伙伴只能看到本地的master分支;
              要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是用这个命令创建本地dev分支:git checkout -b dev origin/dev
              现在在dev上修改,是不是把dev分支push到远程,git add test.tex,git commit -m "add test",git push origin dev
              如果同伴已经向origin/dev推送了他的提价,你也对同文件作了修改,并推送失败(提交有冲突),这是先git pull从最新的提交 origin/dev抓下来,然后在本地合并解决冲突,如果没有指定本地dev分支与远程origin/dev分支的链接,git pull会失败,通过git branch --set-upstream-to=origin/dev dev设置dev和origin/dev的链接,再pull,成功后但合并有冲突,解决冲突再提交再push
       因此,多人协作的工作模式通常是这样:
       首先,可以试图用git push origin <branch-name>推送自己的修改;
       如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
       如果合并有冲突,则解决冲突,并在本地提交;
       没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!
       如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
       这就是多人协作的工作模式,一旦熟悉了,就非常简单。

       小结
       查看远程库信息,使用git remote -v;
       本地新建的分支如果不推送到远程,对其他人就是不可见的;
       从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
       在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
       建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;    
       从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
7.rebase:rebase操作可以把本地未push的分叉提交历史整理成直线;rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比

标签管理
1.创建标签:切换到需要打标签的分支上,git tag <name>打一个新标签。默认标签是打在最新提交的commit之上,如果想在之前提交打标签,执行命令 git
        log --pretty=oneline --abbrev-commit,找到要打标签的commit id 输入命令git tag <name> id,查看标签git tag,
        查看标签信息git show <tagname>;还可以创建带说明的标签用-a指定标签名,-m指定文字说明。
        标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
        小结
        命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
        命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
        命令git tag可以查看所有标签。
2.操作标签:删除标签git tag -d <name> 例如git tag -d v0.1
        创建的标签都只存储在本地,不会自动推送到远程,可以在本地安全删除。要推送某个标签到远程,使用命令git push origin <tagname>;
        或者,一次性推送全部尚未推送到远程的本地标签:git push origin --tags
        如果标签已经推送到远程,要删除远程标签,先从本地删除git tag -d v0.9,再从远程删除git push origin :refs/tags/v0.9
        小结
        命令git push origin <tagname>可以推送一个本地标签;
        命令git push origin --tags可以推送全部未推送过的本地标签;
        命令git tag -d <tagname>可以删除一个本地标签;
        命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

使用github、使用码云

自定义git
1.忽略特殊文件:忽略某些文件时,需要编写.gitignore;.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
2.配置别名:git config --global alias.st status,告诉Git以后st就表示status
        加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用,每个仓库的Git配置文件都放在.git/config文件中,
        别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。
3.搭建git服务器

ps:常见问题

1.git commit -m 没有输入说明 或者 commit后没有 -m ,进入vim模式 的结局方法:输入i,进入insert 输入模式;按 esc 退出输入模式 (下方insert / 插入消失);输入 :wq 后回车 退出 vim 模式,恢复命令输入页面

2.进入git diff界面,无法继续输入命令:输入q回车即可退出显示

3.如果要将单个文件加入到暂存区,可采用如下类似代码:

1

$ git add readme.txt

如果要将多个文件加入到暂存区,可以采用如下类似代码:

1

$ git add readme.txt ant.txt

文件与文件之间用空格分隔;也可以使用通配符方式批量提交文件:

1

$ git add *.html

上面代码可以将所有的html文件提交到暂存区。还有两个杀伤力更强的方式:

1

2

$ git add all

$ git add .

两者都可以将工作区中所有未跟踪或者修改的文件添加到暂存区。

但是两者还是有一些区别的,下面分别做一下介绍:

一.版本导致的差别:

1.x版本:

(1).git add all可以提交未跟踪、修改和删除文件。

(2).git add .可以提交未跟踪和修改文件,但是不处理删除文件。

2.x版本:

两者功能在提交类型方面是相同的。

二.所在目录不同导致的差异:

(1).git add all无论在哪个目录执行都会提交相应文件。

(2).git add .只能够提交当前目录或者它后代目录下相应文件。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值