>  기사  >  개발 도구  >  아직 Git을 사용해본 적이 없나요? 지금 준비하세요!

아직 Git을 사용해본 적이 없나요? 지금 준비하세요!

藏色散人
藏色散人앞으로
2022-11-09 16:09:291983검색

이 글은 Git Tutorial 칼럼에서 Git의 사용법을 소개하기 위해 쓴 글인데, 아주 자세하게 나와있습니다! 아래에서는 Git을 사용하는 방법을 배우도록 안내하겠습니다. 필요한 친구들에게 도움이 되기를 바랍니다.

아직 Git을 사용해본 적이 없나요? 지금 준비하세요!

서문

어두운 바람이 부는 밤, 갑자기 여자 친구가 슬픈 얼굴로 나에게 아직 Git을 이해하지 못한다고 말했습니다. 그때는 너무 늦었습니다. 아무 말도 없이 바로 맹렬하게 쓰기 시작했습니다...

일반적인 코딩 과정에서는 여전히 어느 정도의 Git 작업 기능이 필요합니다. 하지만 특정 시나리오에서 내 요구 사항을 충족하기 위해 어떤 Git 명령을 사용해야 하는지 갑자기 기억나지 않는 몇 가지 시나리오가 여전히 있습니다. 이때 다시 시간을 낭비하는 대신 Google/Baidu를 열고 다양하게 검색해야 합니다. 반복 작업에서는 일반적으로 사용되는 명령의 게임 플레이를 연구하는 것이 좋습니다. 여기에서는 일반적으로 사용되는 Git 시스템 및 명령의 애플리케이션 시나리오와 일반적인 사용법을 소개하는 일련의 사례도 제공합니다.

물론 Git 명령을 사용하는 방법을 아는 것 외에도 Git의 전체 아키텍처가 어떤 것인지도 이해해야 매일 사용하는 명령이 무엇을 하는지 더 명확하게 이해할 수 있습니다.

부적절한 표현이 있다면 바로잡아주시면 감사하겠습니다!

Git 시스템 소개

그림으로 시작하고 추측에 따라 결론이 달라집니다.

Git 体系图

Git 영역 이해

  • 원격 창고 영역: 이곳이 코드 제출의 최종 목적지이므로 말할 것도 없습니다.
  • 远程仓库区:也就是我们代码最终提交的归宿,没啥好说的。
  • 远端分支本地副本:这个其实主要储存了远程仓库各分支数据在本地的一个副本,你可以打开你 Git 项目下的 .git 文件,里面有个 refs/remotes,这里就主要存的就是远程仓库的分支信息,一般你执行 push 或者 pull、fetch 都会往这里进行更新。
  • 本地分支:这里就是我们经常会打交道的区域,你在执行 commit 之后,本质上就是提交到了这个区域,你可以查看你的 .git 目录下的 refs/heads 目录,里面存的就是我们本地的分支代码信息。
  • 暂存区:这个区域就是我们每次执行 git add 之后会存到的区域,用来与本地仓库之间做一个缓存,同时也是 Git 底层设计上来说也算是比较重要的一个区域,它能帮助 Git 在做 diff 的时候提高查找性能。
  • 工作区:这个一般就是我们写代码的地方,比如你的 vscode 打开的项目,你可以进行代码编辑的地方。

stash

除此之外,还有一个特殊的区域,那就是本地的 git 储存区,它是用来干嘛的呢?一般来说你可能在某些场景下会用到它,我们有的时候本地改了代码,但是突然有个人过来问你另一个分支的问题,同时这个时候你在实现某个功能,实现一半,又不想提交到 Git 仓库中,那么你就可以考虑使用 git stash save "临时存一下",这个时候它就会帮你存到这个储存区,你去其他分支做完事情回来,再 git stash pop원격 브랜치의 로컬 복사본: 실제로는 주로 원격 웨어하우스의 각 브랜치 데이터의 로컬 복사본을 저장합니다. Git 프로젝트에서 .git 파일을 열 수 있습니다. /remotes에는 주로 원격 창고의 지점 정보가 여기에 저장됩니다. 일반적으로 push, pull, fetch를 실행하면 여기에 업데이트됩니다.

로컬 브랜치: 이것은 우리가 자주 다루는 영역입니다. 커밋을 실행한 후에는 기본적으로 .git 디렉토리에서 refs/를 확인할 수 있습니다. 지역 지점 코드 정보가 포함된 디렉토리입니다.
스테이징 영역: 이 영역은 git add를 실행할 때마다 저장되는 영역으로, 로컬 웨어하우스로 캐시를 생성하는 데 사용됩니다. Git의 상대적으로 중요한 영역이기도 합니다. Git이 diff를 수행할 때 검색 성능을 향상시키는 데 도움이 될 수 있습니다.

작업 공간: 일반적으로 vscode에서 여는 프로젝트와 같이 코드를 편집할 수 있는 코드를 작성하는 곳입니다.

stash

또한 로컬 Git 저장 영역인 특수 영역이 있는데, 이는 무엇을 위한 것인가요? ? 일반적으로 특정 시나리오에서 사용할 수 있습니다. 때로는 로컬에서 코드를 변경하지만 갑자기 누군가가 와서 다른 분기에 대해 질문하는 동시에 절반만 구현된 특정 기능을 구현합니다. Git 웨어하우스에 제출하고 싶지 않은 경우 git stash save "temporarily save"를 사용하는 것이 좋습니다. 이때 이 저장 영역에 저장됩니다. 다른 지점으로 가서 작업을 완료하면 됩니다. 그냥 돌아와서 git stash pop하면 됩니다.

하지만 작성자는 여전히 이 기능을 사용하는 것을 권장하지 않습니다. 어느 날 전환했다가 다시 전환하여 이 저장 공간을 잊어버리고, 이때 속이면 울게 될 것이기 때문입니다. 물론 이 기능은 여전히 ​​매우 유용하지만 주의해서 사용해야 합니다.

🎜Git의 간단한 워크플로 이해🎜🎜일상 업무에서 Git을 사용할 때 자주 상호 작용할 수 있는 프로세스는 대략 다음과 같습니다(사양에 따라 약간의 차이가 있지만 큰 차이는 없습니다). 🎜
  1. 새로운 요구 사항이 생기면 개발을 위해 마스터로부터 새로운 기능 브랜치를 확인하겠습니다.
  2. 특정 기능 포인트를 개발한 후 git add를 실행하여 코드를 스테이징 영역에 제출합니다. git add 将代码提交到暂存区。
  3. 执行 git commit 将代码提交到本地仓库
  4. 执行 git push 将代码提交到远端分支
  5. 当我们开发完所有需求之后,可能会设立一个专门的测试分支比如名叫 dev 的分支,那么我们就把代码合并到这个测试分支上,发布测试环境进行测试。
  6. 测试完毕之后,我们就需要合代码了,这个时候,我们可以发起一个 merge request,将我们的代码走 CR 流程合并到 master 分支。
  7. 在提交 MR 的过程中,我们一般需要先自己预先将 master 分支的代码合并到当前需要被合并的分支,提交并解决冲突。

以上流程大致概括了一般常规的 Git flow 流程,不同的公司可能会设计自己的规范,这里就不过多指示了。

命令概览

  • git stash
  • git clone
  • git init
  • git remote
  • git branch
  • git checkout
  • git add
  • git commit
  • git rm
  • git push
  • git pull
  • git fetch
  • git merge
  • git log
  • git reset
  • git reflog
  • git revert
  • git cherry-pick
  • git tag
  • git rebase

乍一看,眼花缭乱,当场决定放弃,还是用可视化工具吧。莫慌,且让笔者为你娓娓道来。

命令解析

一般来说,我们本地如果想要使用 Git 管理一些资源文件,首先我们需要有一个仓库才行。常用的方式莫过于,第一去 Gitlab / Github 先创建一个仓库,然后再拉到本地,那这个时候我们就可以用到我们的 clone 命令了。

git stash(临时插进来快速介绍一下)

上面也有初步介绍这个命令的用法,就是用来临时存一下不想被提交的代码变更的,常用命令如下:

  • git stash save 'xxx': 储存变更
  • git stash list: 查看储存区所有提交列表
  • git stash pop: 弹出并应用最近的一次储存区的代码提交
  • git stash drop stash@{n}: 删除某次储存记录
  • git stash clear: 清楚所有 stash 信息

它的数据将被存在你仓库 .git 文件下的 refs/stash 里。

git clone

最基础也是最常用的用法莫过于直接使用

  • git clone xxx.git

这样就能轻松把一个仓库代码拉到本地了,但仅仅知道这一点似乎还不太够。一般我们直接 clone 下来不带参数的话,它会默认停留在 master 分支,有的时候我们依旧需要一些其他诉求,比如怎么拉到本地之后自动切到指定分支呢?

  • git clone xxx.git -b branch1

有了仓库之后,我们总不能一直在 master 分支搞事吧,一般是不是都需要开个新分支改代码,再最后完事了再合到 master,那就需要用到下面介绍 git branch 命令了,不过呢,在讲到具体的分支操作之前呢,笔者还是要先补一下有关于本地仓库的初始化的流程。

git init

除了我们从远端建仓库,有的时候我们自己本地也是可以自己初始化一个 Git 仓库来操作的,这个时候我们就直接使用 git init 就能轻松为当前目录创建一个 git 仓库,也就能开始对当前目录的改动纳入版本管理库了。

不过本地 init 的仓库没法和远端进行交互,所以我们还是需要去 github/gitlab 创建一个远端仓库,然后关联一下,也就是 git remote 命令了。

git remote

用于和远程仓库进行关系绑定处理等等操作。

  • git remote add: 添加一个远程版本库关联
  • git remote rm
  • git commit을 실행하여 로컬 창고에 코드 제출

git push를 실행하여 원격 지점에 코드 제출

🎜모든 요구 사항을 개발한 후 dev라는 브랜치와 같은 전용 테스트 브랜치를 설정한 다음 코드를 이 테스트 브랜치에 병합하고 테스트용 테스트 환경을 릴리스합니다. 🎜🎜테스트 후 코드를 병합해야 합니다. 이때 CR 프로세스를 통해 코드를 마스터 브랜치에 병합하기 위한 병합 요청을 시작할 수 있습니다. 🎜🎜MR을 제출하는 과정에서는 일반적으로 마스터 브랜치의 코드를 현재 병합해야 하는 브랜치에 병합하고 제출하고 충돌을 해결해야 합니다. 🎜🎜위 프로세스는 일반적인 Git 흐름 프로세스를 대략적으로 요약한 것입니다. 회사마다 고유한 사양을 설계할 수 있으므로 여기서는 너무 많은 지침을 제공하지 않습니다. 🎜

명령 개요

    🎜git stash🎜🎜git clone🎜🎜git init 🎜🎜git 원격🎜🎜git 분기🎜🎜git checkout🎜🎜git add🎜🎜 git 커밋🎜🎜git rm🎜🎜git push🎜🎜git pull🎜🎜git fetch🎜🎜<code>git merge🎜🎜git log🎜🎜git 재설정🎜🎜git reflog🎜🎜git revert🎜🎜git Cherry-pick🎜🎜git tag🎜🎜git rebase🎜🎜🎜얼핏 보면, 나는 너무 놀라서 그 자리에서 포기하고 대신 시각화 도구를 사용하기로 결정했습니다. 당황하지 말고 저자가 설명하도록 하세요. 🎜

    명령 분석

    🎜 일반적으로 Git을 사용하여 일부 리소스 파일을 로컬에서 관리하려면 먼저 웨어하우스가 필요합니다. 가장 일반적으로 사용되는 방법은 먼저 Gitlab/Github으로 이동하여 웨어하우스를 만든 다음 이를 로컬 영역으로 가져오는 것입니다. 이때 clone 명령을 사용할 수 있습니다. 🎜

    git stash(빠른 소개를 위해 임시 삽입)

    🎜코드 변경 사항을 임시로 저장하는 데 사용되는 위 명령의 사용법에 대한 사전 소개도 있습니다. 일반적으로 사용되는 명령은 다음과 같습니다: 🎜
      🎜git stash save 'xxx': 변경 사항 저장 🎜🎜git stash list: 보기 저장소 영역의 모든 커밋 목록 🎜🎜git stash pop: 저장소 영역의 최신 코드 커밋 팝업 및 적용🎜🎜git stash drop stash@{n}: 특정 저장소 기록 삭제🎜🎜git stashclear: 모든 저장소 정보 지우기🎜🎜🎜해당 데이터는 창고의 .git 파일 아래 refs/stash에 저장됩니다. 🎜

      git clone

      🎜가장 기본적이고 일반적인 사용법은 직접 사용하는 것입니다🎜
        🎜git clone xxx.git🎜🎜 🎜이렇게 하면 쉽게 해당 지역의 창고 코드를 가져올 수 있지만, 이것만 아는 것만으로는 충분하지 않은 것 같습니다. 일반적으로 매개변수 없이 직접 복제하면 기본적으로 마스터 브랜치에 유지됩니다. 때로는 로컬 영역으로 가져온 후 지정된 브랜치로 자동 전환하는 방법과 같은 다른 요구 사항이 여전히 필요합니다. 🎜
          🎜git clone xxx.git -b Branch1🎜🎜🎜웨어하우스를 확보한 후에 항상 마스터 브랜치에서 작업을 수행할 수는 없습니다. 일반적으로 새 브랜치를 열어야 합니까? 브랜치를 변경하고 최종적으로 완료된 후 마스터에 병합하려면 아래에 소개된 git 브랜치 명령을 사용해야 합니다. 그러나 특정 브랜치 작업에 대해 이야기하기 전에 작성자는 여전히 구성해야 합니다. 로컬 창고의 초기화 프로세스. 🎜

          git init

          🎜 원격으로 웨어하우스를 구축하는 것 외에도 때로는 Git 웨어하우스를 로컬로 초기화하여 작업할 수도 있습니다. 이때 git init를 직접 사용할 수 있습니다. 을 사용하면 현재 디렉터리에 대한 git 저장소를 쉽게 만들고 현재 디렉터리의 변경 사항을 버전 관리 라이브러리에 통합할 수 있습니다. 🎜🎜그러나 로컬 init 저장소는 원격 저장소와 상호 작용할 수 없으므로 여전히 github/gitlab으로 이동하여 원격 저장소를 생성한 다음 이를 연결해야 합니다. 이는 git remote 명령입니다. 🎜

          git 원격

          🎜은 원격 창고와의 관계 바인딩 처리 및 기타 작업을 수행하는 데 사용됩니다. 🎜
            🎜git 원격 추가: 원격 저장소 연결 추가 🎜🎜git 원격 rm: 원격 저장소 연결 삭제 🎜🎜🎜예를 들어 로컬에 하나가 있습니다. 초기화된 창고와 생성된 원격 빈 창고를 연결하려면 다음 작업을 수행할 수 있습니다. 🎜
  1. git Remote add Origin xxx.git로컬 웨어하우스에 먼저 추가하세요git remote add origin xxx.git先添加到本地仓库
  2. git push -u origin master:表示把当前仓库的 master 分支和远端仓库的 master 分支关联起来,后面我们执行 push 或者 pull 都可以非常方便的进行操作了。

git branch

在拿到一个项目之后,你首先还是应该看一下当前仓库现在有哪些分支,不要待会创建新分支发现名字重复之类的问题,那这个时候我们就可以使用 git branch 来查看一下相关的分支了。

  • git branch:查看本地所有分支信息
  • git branch -r:查看远程仓库所有分支
  • git branch -a:查看本地和远程仓库所有分支

一般来说如果分支太多的话,还是建议使用可视化工具来查看分支信息,比如 vscode 或者 source tree 等软件等等。

当然 IDEA 也是可以的。

git checkout

如果我们想以当前分支为基准,创建一个新的分支并切换过去,可以使用如下命令。

  • 创建并切换到指定新分支:git checkout -b branch1

git add

我们在某个分支更改了代码之后,想要把它提交一下,那么你第一步要做的就是,执行 git add

  • git add [file1] [file2]: 添加一个或多个文件到暂存区

一般我们平时在使用的时候,用的比较多的应该还是:

  • git add .:把当前目录下得所有文件改动都添加到暂存区
  • git add -A:把当前仓库内所有文件改动都添加到暂存区

对笔者来说,用的最多的还是这个 git add -A 命令,因为大多数情况,我们都应该把所有变更都加到暂存区里,如果没有,那大概率是忘了。

git commit

文件添加到暂存区之后,我们就可以执行下一步操作了。

  • git commit [file1] ... -m [message]:将暂存区的内容提交到本地 git 版本仓库中
    • -m 表示的是当前提交的信息
    • -a 对于已经被纳入 git 管理的文件(该文件你之前提交过 commit),那么这个命令就相当于帮你执行了上述 git add -A,你就不用再 add 一下了;对于未被 git 管理过的(也就是新增的文件),那么还是需要你先执行一下 git add -A,才能正确被 commit 到本地 git 库。

通常情况下,我们用的比较多得应该是 git commit -m 'feat: do something',设置当前提交的信息。当然,如果你没有强诉求需要 git addgit commit 一定要分开,那你大可选择 git commit -am,方便又快捷。

git rm

这个其实也挺有用的,比如我们项目中有个文件叫 .env,这个文件是一个私有的,不能被提交到远程的,但是我们不小心提交到了本地仓库中,这个时候我们把这个文件添加到 .gitignore 文件中,表示需要被 git 忽略提交,但是由于我们已经提交到本地仓库了,所以如果不先从 git 仓库删除是没用的。

如果直接右键删除,那么这个文件的记录还是会被保存到远端仓库,别人还是能看得到你这个信息,所以我们需要先从 git 仓库中删掉这个文件才行。

  • git rm .env:执行完这个命令就表示 .env 文件从 git 仓库中删除了,配合 .gitignore 就能保证以后所有的 .env 文件变更都不用担心被提交到远程仓库。

  • git rm -r dist:如果我们要删除的是一个目录,那么加上 -r 参数就好了。

git push

接下来我们想要把刚创建好得分支推送到远端,一般来说我们可能会需要用到 git push,但我们这是个新分支,根本没和远端仓库建立任何联系,那么我们就需要加点参数,让他们关联上:

  • 推送分支并建立关联关系:git push --set-upstream origin branch1
  • git push -u Origin master: 현재 웨어하우스의 마스터 브랜치와 원격 창고의 마스터 지점이 연결되면 나중에 매우 편리하게 푸시 또는 풀 작업을 수행할 수 있습니다.

git Branch

프로젝트를 받은 후 먼저 현재 웨어하우스에 어떤 브랜치가 있는지 살펴보고 새로 만들지 마세요. 나중에 중복된 이름과 같은 문제가 발견되면 git Branch를 사용하여 관련 분기를 확인할 수 있습니다.

    git Branch: 모든 로컬 브랜치 정보 보기

    🎜git Branch -r: 원격 웨어하우스의 모든 브랜치 보기 🎜🎜git Branch -a code>: 로컬 및 원격 창고의 모든 지점 보기 🎜🎜🎜 일반적으로 지점이 너무 많으면 vscode 또는 소스 트리 및 기타 소프트웨어와 같은 시각적 도구를 사용하여 지점 정보를 보는 것이 좋습니다. 🎜<blockquote>🎜물론 IDEA도 가능합니다. 🎜</blockquote> <h3 data-id="heading-12">git checkout</h3>🎜현재 브랜치를 기반으로 새 브랜치를 생성하고 전환하려면 다음 명령을 사용하면 됩니다. 🎜<ul>🎜지정된 새 브랜치를 생성하고 전환합니다: <code>git checkout -b Branch1🎜🎜

    git add

    🎜우리는 어딘가에 있습니다 브랜치가 코드를 변경하고 이를 제출하려는 후 해야 할 첫 번째 단계는 git add🎜
      🎜git add [file1] [file2]: 임시 저장 영역에 하나 이상의 파일을 추가합니다. 🎜🎜🎜일반적으로 우리가 일반적으로 사용할 때 가장 일반적으로 사용되는 파일은 다음과 같습니다: 🎜<ul>🎜<code>git add .: 모두 현재 디렉터리의 파일 변경 사항은 임시 저장 영역에 추가됩니다🎜🎜git add -A: 현재 웨어하우스의 모든 파일 변경 사항이 임시 저장 영역에 추가됩니다🎜🎜
      🎜저작자의 경우, 가장 일반적으로 사용되는 명령은 git add -A 명령입니다. 대부분의 경우 모든 변경 사항을 준비 영역에 추가해야 하기 때문입니다. 그렇지 않으면 잊어버릴 가능성이 높습니다. 🎜

      git commit

      🎜파일이 준비 영역에 추가되면 다음 단계를 수행할 수 있습니다. 🎜
        🎜git commit [file1] ... -m [message]: 스테이징 영역의 내용을 로컬 git 버전 저장소에 제출합니다.
          🎜-m은 현재 커밋을 나타냅니다. 정보 🎜🎜-a git 관리에 포함된 파일(이전에 커밋된 파일)의 경우 이 명령은 위의 git add -A를 실행하는 것과 동일하며 필요하지 않습니다. git에서 관리되지 않은 파일(즉, 새로 추가된 파일)에 대해 다시 추가하려면 해당 파일이 로컬 git 라이브러리에 올바르게 커밋되기 전에 git add -A를 실행해야 합니다. . 🎜🎜🎜🎜🎜보통 우리가 더 자주 사용하는 것은 현재 커밋 정보를 설정하기 위해 git commit -m 'feat: do Something'입니다. 물론, git addgit commit를 분리해야 한다는 강한 요구가 없다면 git commit -am을 선택할 수 있습니다. > 편리하고 빠릅니다. 🎜

          git rm

          🎜이것은 실제로 매우 유용합니다. 예를 들어 우리 프로젝트에 .env라는 파일이 있는데 이 파일은 비공개 파일이므로 제출할 수 없습니다. Remote 인데 실수로 로컬 웨어하우스에 제출했는데 이때 이 파일을 .gitignore 파일에 추가했는데, 이는 이미 로컬 웨어하우스에 제출했기 때문에 제출을 무시해야 함을 나타냅니다. 먼저 git Warehouse에서 삭제하지 않으면 쓸모가 없습니다. 🎜🎜마우스 오른쪽 버튼을 클릭하여 삭제하면 이 파일의 기록은 원격 저장소에 계속 저장되고 다른 사람들도 귀하의 정보를 볼 수 있으므로 먼저 이 파일을 git 저장소에서 삭제해야 합니다. 🎜
            🎜🎜git rm .env: 이 명령을 실행한 후에는 .env 파일이 git 저장소에서 삭제되었음을 의미합니다. .gitignore를 사용하면 삭제되지 않았는지 확인할 수 있습니다. 향후 모든 .env 파일 변경 사항을 걱정해야 합니다. 원격 저장소에 제출됩니다. 🎜🎜🎜🎜git rm -r dist: 삭제하려는 항목이 디렉터리인 경우 -r 매개변수만 추가하면 됩니다. 🎜🎜🎜

            git push

            🎜다음으로 새로 생성된 브랜치를 원격 끝으로 푸시하려고 합니다. 일반적으로 말하면 git push를 사용해야 할 수도 있습니다. 새 지점을 만들고 원격 창고와의 연결을 전혀 설정하지 않았으므로 연결하기 위해 몇 가지 매개변수를 추가해야 합니다: 🎜
              🎜분기를 푸시하고 관계를 설정합니다: git push --set- upstream Origin Branch1🎜🎜🎜작업이 완료된 후 원격 창고에 가서 살펴보면 우리가 만든 새 브랜치가 Push Up된 것을 확인할 수 있습니다. 다음으로, 일부 친구들은 원격 창고에 이미 이 지점 이름이 있으면 어떻게 되는지 묻고 싶어할 수 있습니다. 🎜🎜여기에는 두 가지 유형이 있습니다: 🎜
    1. 한 가지는 로컬 코드와 원격 코드 사이에 충돌이 없고 로컬에서 새로운 제출물이 있는 경우에도 여전히 위 명령을 실행할 수 있다는 것입니다. 그러면 현재 로컬 브랜치를 원격 브랜치와 직접 연결하고 동시에 변경사항을 제출하세요.
    2. 또 하나는 로컬 브랜치와 원격 브랜치 사이에 충돌이 있다는 것입니다. 이때 위 명령을 실행하면 충돌 프롬프트가 나타납니다. 그런 다음 현재 원격 브랜치의 코드를 먼저 풀다운해야 합니다. 충돌을 해결하려면 git pull 명령을 사용해야 합니다.

    git pull

    일반적으로 현재 브랜치가 원격 브랜치와 연결을 설정한 경우 원격 브랜치를 병합하려면 git pull만 실행하면 됩니다. 그러나 위에서 언급한 git push와 충돌이 있는 경우 연결이 설정되기 전에 병합을 위해 풀다운해야 하는 코드 분기를 지정해야 합니다. git pull 就好了,不用带其他参数,但如果和上面提到的 git push 时产生了冲突,还没有建立联系的时候,我们就需要指定需要拉取哪个分支的代码下来进行合并了。

    • 拉取指定远端分支合并到本地当前分支:git pull origin branch1

    这里的 origin 是我们对远端仓库的命名,想改也是可以的,不过一般都是用的 origin。

    回到上面提到的冲突问题,我们可以直接使用 git pull 然后指定合并当前本地分支想要建立联系的远程分支,然后本地解决一下冲突,然后提交一下改动,再执行 git push --set-upstream origin branch1 命令就大功告成了。

    git fetch

    了解完上面描述的 git pull,命令之后,其实这个命令也很好理解了,特定时候,可能我们只是想把远端仓库对应分支的变更拉到本地而已,并不想自动合并到我的工作区(你当前正在进行代码变更的工作区),等晚些时候我写完了某部分的代码之后再考虑合并,那么你就可以先使用 git fetch

    fetch 完毕之后,我提交了自己当前工作去的变更到本地仓库,然后想合并一下远端分支的更改,这个时候执行一下 git merge origin/[当前分支名](默认一般是用 origin 表示远端的分支前缀)即可。

    git merge

    合并指定分支代码到当前分支。一般来说,我们用的比较多的场景可能是,远端仓库 master 分支有变更了,同时这个时候我们准备提 MR 了,那么就需要先合一下 master 的代码,有冲突就解决下冲突,那这个时候我们可以做以下操作:

    1. 切到 master 分支,git pull 拉一下最新代码
    2. 切回开发分支,执行 git merge master 合并一下 master 代码

    同理,上面介绍的 git merge origin/xxx 也是一样的用法。

    git log

    顾名思义,就是日志的意思,执行这个命令之后,我们能看到当前分支的提交记录信息,比如 commitId 和提交的时间描述等等,大概长下面这样:

    commit e55c4d273141edff401cbc6642fe21e14681c258 (HEAD -> branch1, origin/branch1)
    Author: 陌小路 <44311619+STDSuperman@users.noreply.github.com>
    Date:   Mon Aug 1 23:16:11 2022 +0800
    
        Initial commit复制代码

    这个时候可能有读者会问了,这个都用来干啥的,简单的用法呢就是看看有谁提交了啥,还有更重要的用法呢就是进行代码版本的回滚,或者其他有意思的操作,且听笔者为你微微道来。

    git reset

    • git reset [--soft | --mixed | --hard] [HEAD]

    关于 HEAD:

    • HEAD 表示当前版本
    • HEAD^ 上一个版本
    • HEAD^^ 上上一个版本
    • HEAD^^^ 上上上一个版本
    • HEAD~n 回撤 n 个版本,这种也是更加方便的

    参数解析

    以下解析均基于后接参数为 HEAD^,也就是git reset HEAD^

    • --soft: 重置你最新一次提交版本,不会修改你的暂存区和工作区。
    • --mixed: 默认参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
    • --hard: 重置所有提交到上一个版本,并且修改你的工作区,会彻底回到上一个提交版本,在代码中看不到当前提交的代码,也就是你的工作区改动也被干掉了。

    说了半天似乎不是很好理解,我们举个栗子理解下:

    比如:

    1. 我改动了我的 README 文件,在我们的工作区就产生了一次改动,但是这个时候还没有提交到暂存区,在 vscode 里会显示为工作区修改的标记
    2. 接着我们执行 git add,这个时候你查看暂存区,会发现这次改动被提交进去了,同时被 vscode 标记为已被提交至暂存区
    3. 然后再执行 git commit
      • 지정된 원격 브랜치를 가져와서 로컬 현재 브랜치에 병합합니다: git pull Origin Branch1

    여기서 원본은 원격 창고의 이름입니다. 예, 하지만 일반적으로 원산지가 사용됩니다.

    🎜위에서 언급한 충돌 문제로 돌아가서, git pull을 직접 사용한 다음 원격 지점을 지정하여 연락하려는 현재 로컬 지점을 병합한 다음 로컬에서 충돌을 해결하고 변경 사항을 제출한 다음 실행할 수 있습니다. git push - -set-upstream Origin Branch1 명령을 실행하면 완료됩니다. 🎜

    git fetch🎜🎜위에서 설명한 git pull 명령을 이해하고 나면 이 명령은 실제로 이해하기 쉽습니다. 변경 사항을 원격 웨어하우스의 해당 분기로 로컬로 가져오고 싶지만 내 작업 공간(현재 코드를 변경하고 있는 작업 공간)에 자동으로 병합하고 싶지는 않습니다. 나중에 작성을 마친 후 병합을 고려하겠습니다. 코드의 특정 부분을 삭제한 다음 먼저 git fetch를 사용할 수 있습니다. 🎜🎜Fetch가 완료된 후 현재 작업 중인 변경 사항을 로컬 웨어하우스에 제출한 후 원격 브랜치에서 변경 사항을 병합하려고 합니다. 이때 git merge Origin/[현재 브랜치 이름]을 실행합니다. ] (기본적으로 원본은 일반적으로 원격 분기 접두사를 나타내는 데 사용됩니다). 🎜

    git merge🎜🎜지정된 분기 코드를 현재 분기에 병합합니다. 일반적으로 우리가 더 많이 사용하는 시나리오는 원격 창고의 마스터 브랜치가 변경된 것일 수 있으며 이때 MR을 제출할 예정이므로 먼저 마스터 코드를 병합하고 충돌이 있는 경우 충돌을 해결해야 합니다. 이때 우리는 다음 작업을 수행할 수 있습니다: 🎜🎜🎜마스터 브랜치로 전환하고 git에서 최신 코드를 가져옵니다. 🎜🎜개발 브랜치로 다시 전환하고 git merge master를 실행하여 마스터 코드를 병합합니다. 🎜🎜🎜마찬가지로 xxx 위에서 소개한 git merge Origin/ 도 같은 방식으로 사용됩니다. 🎜

    git log🎜🎜이름에서 알 수 있듯이 로그를 의미합니다. 이 명령을 실행하면 commitId, 제출 시간 설명 등 현재 브랜치의 제출 기록 정보를 볼 수 있습니다. , etc. 아마도 다음과 같을 것입니다: 🎜
    commit e62b559633387ab3a5324ead416f09bf347d8e4a (HEAD -> master)
    Author: xiaohang.lin <xiaohang.lin@alibaba-inc.com>
    Date:   Sun Aug 14 18:08:56 2022 +0800
    
        merge
    
    commit 36577ea21d79350845f104eee8ae3e740f19e038 (origin/master, origin/HEAD)
    Author: 陌小路 <44311619+STDSuperman@users.noreply.github.com>
    Date:   Sun Aug 14 15:57:34 2022 +0800
    
        Update README.md复制代码
    🎜 이때 일부 독자들은 이것이 무엇에 사용됩니까? 사용하는 간단한 방법은 누가 무엇을 제출했는지 확인하는 것이고, 더 중요한 사용 방법은 다음과 같습니다. 코드 버전을 수행하거나 기타 흥미로운 작업을 수행하려면 작성자에게 설명을 요청하세요. 🎜

    git 재설정🎜
      🎜git 재설정 [--soft | --mixed | --hard] [HEAD]🎜

    HEAD 정보:

      🎜HEAD는 현재 버전을 의미합니다. 🎜🎜HEAD^ 이전 버전 🎜🎜HEAD^^ 이전 버전 🎜🎜HEAD^^^ 이전 버전 🎜🎜HEAD ~n 롤백 n 더 편리한 버전🎜

    매개변수 분석

    🎜다음 분석은 다음 매개변수 HEAD^를 기반으로 하며, 또한 git입니다. HEAD^을(를) 재설정하세요. 🎜
      🎜--soft: 준비 영역 및 작업 공간을 수정하지 않고 최근 제출된 버전을 재설정합니다. 🎜🎜--mixed: 마지막 커밋(커밋)과 일치하도록 스테이징 영역의 파일을 재설정하는 데 사용되는 기본 매개 변수이며 작업 영역 파일의 내용은 변경되지 않습니다. 🎜🎜--hard: 모든 제출을 이전 버전으로 재설정하고 작업 영역을 수정하면 이전 제출 버전으로 완전히 돌아가므로 코드에서 현재 제출된 코드를 볼 수 없습니다. 작업공간 변경사항도 삭제되었습니다. 🎜
    🎜오랜 시간 이야기를 해보니 이해하기가 쉽지 않은 것 같습니다. 이해를 돕기 위해 예를 들어보겠습니다. 🎜🎜예: 🎜🎜🎜README 파일을 변경했는데 변경 사항이 있었습니다. 우리 작업 공간에 있지만 아직 Staging Area에 제출되지 않았으며 vscode에서 작업 공간 수정 표시로 표시됩니다. 그러면 이때 git add를 실행합니다. 스테이징 영역을 확인하면 이 변경 사항이 입력되었으며 vscode에 의해 스테이징 영역에 제출된 것으로 표시되었음을 알 수 있습니다. 그런 다음 git commit을 실행합니다. 완료되었습니다🎜🎜🎜다음으로 이 제출을 철회하고자 합니다. 위의 세 가지 매개변수에 반영되는 성능은 다음과 같습니다. 🎜
    • --soft:我们对 README 的更改状态现在变成已被提交至暂存区,也就是上面 2 的步骤。
    • --mixed: 我们对 README 的更改变成还未被提交至暂存区,也就是上面 1 的步骤。
    • --hard:我们对 README 的所有更改全没了,git log 中也找不到我们对 README 刚刚那次修改的痕迹。

    默认情况下我们不加参数,就是 --mixed,也就是重置暂存区的文件到上一次提交的版本,文件内容不动。一般会在什么时候用到呢?

    场景一(撤销 git add)

    可能大部分情况下,比如 vscode 其实大家更习惯于使用可视化的撤销能力,但是呢,这里我们其实也可以稍微了解下这其中的奥秘,其实也很简单:

    • 方式一:git reset
    • 方式二:git reset HEAD

    其实一二都是一样,如果 reset 后面不跟东西就是默认 HEAD。

    场景二 (撤销 git commit)

    当你某个改动提交到本地仓库之后,也就是 commit 之后,这个时候你想撤回来,再改点其他的,那么就可以直接使用 git reset HEAD^。这个时候你会惊奇的发现,你上一版的代码改动,全部变成了未被提交到暂存区的状态,这个时候你再改改代码,然后再提交到暂存区,然后一起再 commit 就可满足你的需求了。

    除了这种基础用法,我们还可以配合其他命令操作一下。

    场景三

    某一天你老板跟你说,昨天新加的功能不要了,给我切回之前的版本看看效果,那么这个时候,你可能就需要将工作区的代码回滚到上一个 commit 版本了,操作也十分简单:

    • git log 查看上一个 commit 记录,并复制 commitId
    • git reset --hard commitId 直接回滚。

    场景四

    如果某一个你开发需求正开心呢,突然发现,自己以前改的某个东西怎么不见了,你想起来好像是某次合并,没注意被其他提交冲掉了,你心一想,完了,写了那么多,怎么办?很简单,回到有这份代码的那个版本就好了(前提你提交过到本地仓库)。

    假设我们有这么两个提交记录,我们需要下面那个 365 开头 commitId 的代码:

    commit e62b559633387ab3a5324ead416f09bf347d8e4a (HEAD -> master)
    Author: xiaohang.lin <xiaohang.lin@alibaba-inc.com>
    Date:   Sun Aug 14 18:08:56 2022 +0800
    
        merge
    
    commit 36577ea21d79350845f104eee8ae3e740f19e038 (origin/master, origin/HEAD)
    Author: 陌小路 <44311619+STDSuperman@users.noreply.github.com>
    Date:   Sun Aug 14 15:57:34 2022 +0800
    
        Update README.md复制代码
    1. 抢救第一步 git log 找到有你这个代码的那个 commitId(也就是 36577ea21d79350845f104eee8ae3e740f19e038)
    2. 抢救第二步 git reset --hard commitId
    3. 第三步:Ctrl + c 你的目标代码

    这个时候你想把复制好的代码写回去,该怎么办呢,你可能会再 git log 看一下我们 reset 之前的 commitId,你会发现,完了,之前的 commitId 都没了,只有这个 365 了。

    commit 36577ea21d79350845f104eee8ae3e740f19e038 (origin/master, origin/HEAD)
    Author: 陌小路 <44311619+STDSuperman@users.noreply.github.com>
    Date:   Sun Aug 14 15:57:34 2022 +0800
    
        Update README.md复制代码

    不要慌,请记住一句话,只要你不删你本地的 .git 仓库,你都能找回以前所有的提交。

    git log 看不到的话,我们就可以祭出我们的绝招了:git reflog

    36577ea (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: reset: moving to 36577ea21d79350845f104eee8ae3e740f19e038
    e62b559 HEAD@{1}: reset: moving to e62b559633387ab3a5324ead416f09bf347d8e4a复制代码

    这里我们可以看到两行记录,一个是我们执行 reset 到 365 的记录,另一条不知道是啥,不重要,我们想回到我们刚刚 reset 之前的状态也很简单,直接复制它上一次的变动也就是这个 e62b559,然后执行 git reset --hard e62b559,然后你会惊奇的发现,你之前的代码又回来了。

    接下来把你以前版本的代码,再 Ctrl + v 放进来就完成了。

    git reflog

    介绍:用来查看你的所有操作记录。

    既然 git log 看不到我之前 commitId 了,那么就回到 reset 之前的状态吧!

    git revert

    当然了,如果是针对 master 的操作,为了安全起见,一般还是建议使用 revert 命令,他也能实现和 reset 一样的效果,只不过区别来说,reset 是向后的,而 revert 是向前的,怎么理解呢?简单来说,把这个过程当做一次时光穿梭,reset 表示你犯了一个错,他会带你回到没有犯错之前,而 revert 会给你一个弥补方案,采用这个方案之后让你得到的结果和没犯错之前一样。

    举个栗子: 假设你改了 README 的描述,新增了一行文字,提交上去了,过一会你觉得这个写了有问题,想要撤销一下,但是又不想之前那个提交消失在当前历史当中,那么你就可以选择使用 git revert [commitId],那么它就会产生一次新的提交,提交的内容就是帮你删掉你上面新增的内容,相当于是一个互补的操作。

    PS D:\Code\other\git-practice> git revert 3b18a20ad39eea5264b52f0878efcb4f836931ce
    On branch branch2
    Your branch is ahead of 'origin/branch2' by 1 commit.
      (use "git push" to publish your local commits)

    这个时候,它会提示你可以把新的改动 push 上去了。

    其实你如果在 gitlab 进行 mr 之后,想要回滚这个 mr,一般它会给你一个 revert 的按钮选项,让你进行更安全的回滚操作。

    git cherry-pick

    其实对于我们工作中大部分场景下应该用不到这个功能,但是呢有的时候这个命令又能挽救你于水火之间,那就是当某个倒霉蛋忘记切分支,然后在 master 分支上改了代码,并且提交到了本地仓库中,这个时候使用git cherry-pick简直就是神器了。

    • git cherry-pick:将执行分支的指定提交合并到当前分支。

    一听介绍就来精神了,雀氏有点东西,比如我在 master 分支提交了某个需求的代码,同时还没提交到远程分支,那么你就可以先 git log 查看一下当前的提交,找到 master 分支正常提交之后的所有 commitId,然后复制出来,然后再切到你建好的开发分支,接着执行 git cherry-pick master commitId1 commitId2 commitId4

    完事之后记得清理一下作案现场,把你的 master 分支代码恢复到正常的提交上去。

    git tag

    顾名思义,也就是打标签的意思。一般可能会在你发布了某个版本,需要给当前版本打个标签,你可以翻阅 vite 的官方 git 仓库,查看它的 tag 信息,它这里就标注了各个版本发布时候的 tag 标签。

    它有两种标签形式,一种是轻量标签,另一种是附注标签。

    轻量标签

    • 创建方式:git tag v1.0.0

    它有点像是对某个提交的引用,从表现上来看,它又有点像基于当前分支提交给你创建了一个不可变的分支,它是支持你直接 checkout 到这个分支上去,但是它和普通分支还是有着本质的区别的,如果你切换到了这个 tag "分支",你去修改代码同时产生了一次提交,亦或者是 reset 版本,这对于该 tag 本身不会有任何影响,而是为你生成了一个独立的提交,但是却在你的分支历史中是找不到的,你只能通过 commitId 来切换到本次提交,看图:

    tag commitId

    那如果你从其他分支通过 commitId 切换到这个改动上,它会提示你以下内容:

    Note: switching to 'be276009'.
    
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by switching back to a branch.
    
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -c with the switch command. Example:
    
      git switch -c <new-branch-name>
    
    Or undo this operation with:
    
      git switch -

    大致意思就是你可以选择丢弃或者保留当前更改,如果需要保留的话直接使用下面的 git switch 命令创建一个新分支即可。

    附注标签

    • 创建方式:git tag -a v1.0.1 -m "发布正式版 1.0.1"

    引用官方文档的描述:

    而附注标签是存储在 Git 数据库中的一个完整对象, 它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间, 此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证。

    从概念上看,轻量标签更像是一个临时的标签,而附注标签更加正式一点,能够保留更多的信息。它创建的方式和轻量标签区别主要是 -a 和 -m 参数,如果你的 -m 参数不传,那么编辑器会让你手动填写。

    对比标签信息

    打完标签之后,我们可以使用 git show 命令来看看这两种标签最终体现的信息有哪些。

    轻量标签
    commit dcbd335be87f51eaa0cc1852400e64e9f46e84d8 (HEAD -> test-branch1, tag: v1.0.2, tag: v1.0.1)
    Author: STDSuperman <2750556766@qq.com>
    Date:   Tue Aug 16 22:54:36 2022 +0800
    
        xx
    
    diff --git a/README.md b/README.md
    index 715766a..b4cdea6 100644
    --- a/README.md
    +++ b/README.md
    @@ -1 +1,3 @@-# git-practice\ No newline at end of file
    +# git-practice
    +
    +test tag
    附注标签
    tag v1.0.1
    Tagger: STDSuperman <2750556766@qq.com>
    Date:   Tue Aug 16 22:58:27 2022 +0800
    
    发布正式版 1.0.0
    
    commit dcbd335be87f51eaa0cc1852400e64e9f46e84d8 (HEAD -> test-branch1, tag: v1.0.1)
    Author: STDSuperman <2750556766@qq.com>
    Date:   Tue Aug 16 22:54:36 2022 +0800
    
        xx
    
    diff --git a/README.md b/README.md
    index 715766a..b4cdea6 100644
    --- a/README.md
    +++ b/README.md

    从信息丰富度上来说,附注标签能保留的信息会更多。

    推送标签

    • git push origin tagName
    $> git push origin v1.0.1Enumerating objects: 6, done.
    Counting objects: 100% (6/6), done.
    Delta compression using up to 12 threads
    Compressing objects: 100% (3/3), done.
    Writing objects: 100% (4/4), 448 bytes | 448.00 KiB/s, done.
    Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
    To github.com:STDSuperman/git-practice.git
     * [new tag]         v1.0.1 -> v1.0.1

    当然,附注标签和轻量标签都是可以被推送到远端的。

    其他命令

    • 查看标签:git tag
    • 筛选标签:git tag -l v1.0.1
    • 删除标签:git tag -d v1.0.1
    • 删除远程标签:git push origin --delete v1.0.2
      • 另一种删除远程方式(表示将“:”前面空值替换到远程,也不失为一种方式):git push origin :refs/tags/v1.0.1

    git rebase

    这块其实涉及的玩法会相对来说复杂一点,可能还是需要拿来和 merge 做一下对比才更加有意义,东西有点多,先搁置一下。

    WIP...

    위 내용은 아직 Git을 사용해본 적이 없나요? 지금 준비하세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 juejin.im에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제