git教程与常见问题
2026查看本地仓库存储但是没有推送到远程库的文件git diff --name-only origin/dev..HEAD要查看本地已修改但未提交到远程仓库的文件可以使用以下 Git 命令1. 查看已修改但未暂存未 add的文件git status这会显示所有已修改、新增或删除的文件但尚未暂存即未执行git add的文件。这些文件还在工作区没有进入本地暂存区。2. 查看已暂存但未提交已 add 但未 commit的文件git diff --cached或git diff --staged这会显示已暂存git add后但未提交的文件的修改内容。3. 查看本地已提交但未推送到远程仓库的提交及涉及的文件首先查看本地分支领先远程分支的提交git log origin/master..master将master替换为你的分支名origin/master是远程分支。查看这些提交中修改了哪些文件git diff --name-only origin/master..master这会列出本地有而远程没有的提交中涉及的所有文件。4. 快捷方式查看所有未推送到远程的修改包括未提交的git status结合git log --oneline origin/master..master先看状态再看未推送的提交列表。示例流程先用git status看工作区和暂存区的状态。再用git log --oneline origin/master..master查看本地有、远程无的提交。用git diff --name-only origin/master..master列出这些提交中的文件。这样就能全面了解本地存储了但未同步到远程仓库的所有修改。2024-1-1 git统计查看命令1.查询所有用户的提交总次数git log --pretty%aN | sort | uniq -c | sort -k1 -n -r根据时间查询次数git log --after2023-01-01 00:00:00 --before2023-12-31 23:59:59 --pretty%aN | sort | uniq -c | sort -k1 -n -r2.gitee统计各用户提交行数git log --format%aN | sort -u | while read name; do echo -en $name\t; git log --author$name --prettytformat: --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 --after2023-01-01 00:00:00 --before2023-12-31 23:59:59 --prettytformat: --numstat | awk { add $1; subs $2; loc $1 - $2 } END { printf added lines: %s, removed lines: %s, total lines: %s\n, add, subs, loc } -; done3.查看对应日期个人代码提交量git log --author$(git config --get user.name) --since2023-01-01 --until2023-12-31 --prettytformat: --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-05git 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 --after2023-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 tree3.删除文件你通常直接在文件管理器中把没用的文件删了或者用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 gitgithub.com:66.github/github仓库名repo-name.git。由于远程库是空的第一次推动master分支时加上了-u参数。git push -u origin mastergit push 实际是把当前分支master推送到远程。此后每次本地提交后只要有必要就可以使用命令git push origin master推送最新修改2.从远程仓库克隆比如新仓库的名字是gitskillsgit clone gitgithub.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 --prettyoneline --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 devgit 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 devmaster主分支要时刻与远程同步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-toorigin/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之上如果想在之前提交打标签执行命令 gitlog --prettyoneline --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、使用码云自定义git1.忽略特殊文件忽略某些文件时需要编写.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文件提交到暂存区。还有两个杀伤力更强的方式12$ git add all$ git add .两者都可以将工作区中所有未跟踪或者修改的文件添加到暂存区。但是两者还是有一些区别的下面分别做一下介绍一.版本导致的差别1.x版本1.git add all可以提交未跟踪、修改和删除文件。2.git add .可以提交未跟踪和修改文件但是不处理删除文件。2.x版本两者功能在提交类型方面是相同的。二.所在目录不同导致的差异1.git add all无论在哪个目录执行都会提交相应文件。2.git add .只能够提交当前目录或者它后代目录下相应文件。