<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="https://publishpress.com/"
	>

<channel>
	<title>Git Archives - Tomoshare</title>
	<atom:link href="https://blog.tomosia.com.vn/danh-muc/git/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.tomosia.com.vn/danh-muc/git/</link>
	<description>Kênh chia sẻ kiến thức Tomosia Việt Nam</description>
	<lastBuildDate>Thu, 07 Dec 2023 01:35:36 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://blog.tomosia.com.vn/wp-content/uploads/2023/09/cropped-icon-32x32.png</url>
	<title>Git Archives - Tomoshare</title>
	<link>https://blog.tomosia.com.vn/danh-muc/git/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Cách sử dụng nhiều tài khoản GitHub trên một thiết bị bằng SSH Key</title>
		<link>https://blog.tomosia.com.vn/cach-su-dung-nhieu-tai-khoan-github-tren-mot-thiet-bi-bang-ssh-key/</link>
					<comments>https://blog.tomosia.com.vn/cach-su-dung-nhieu-tai-khoan-github-tren-mot-thiet-bi-bang-ssh-key/#comments</comments>
		
		<dc:creator><![CDATA[admin_tomosia]]></dc:creator>
		<pubDate>Thu, 07 Dec 2023 01:35:34 +0000</pubDate>
				<category><![CDATA[Kinh nghiệm]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[git]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=2379</guid>

					<description><![CDATA[<p>Nhu cầu quản lý nhiều tài khoản GitHub trên cùng một thiết bị là điều mà bất kì&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/cach-su-dung-nhieu-tai-khoan-github-tren-mot-thiet-bi-bang-ssh-key/">Cách sử dụng nhiều tài khoản GitHub trên một thiết bị bằng SSH Key</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Nhu cầu quản lý nhiều tài khoản GitHub trên cùng một thiết bị là điều mà bất kì developer nào cũng sẽ cần. Ai cũng có những account Github khác nhau, phục vụ cho những mục đích khác nhau. Ví dụ như một account mail công ty và một account cho mail cá nhân. Dưới đây là kinh nghiệm mà mình đã sử dụng để chuyển đổi giữa 2 account Github của mình. Các bước cấu hình sẽ lần lượt là:</p>



<h2 id="tao-ssh-key" class="wp-block-heading">Tạo SSH key</h2>



<pre class="wp-block-code"><code>ls -al ~/.ssh</code></pre>



<p class="wp-block-paragraph">Đầu tiên, chúng ta có thể kiểm tra xem liệu chúng ta có bất kỳ SSH key nào hiện có hay không.</p>



<p class="wp-block-paragraph">Nếu đã có, ta có thể dùng các key đó, còn nếu chưa có key nào cả thì có thể tạo bằng lệnh dưới. </p>



<pre class="wp-block-code"><code>ssh-keygen -t rsa -C "email_cua_ban@work-mail.com" -f "ssh_file_name"</code></pre>



<p class="wp-block-paragraph">Ví dụ:</p>



<pre class="wp-block-code"><code>ssh-keygen -t rsa -C "bao.van@tomosia.com" -f "id_rsa_work"</code></pre>



<p class="wp-block-paragraph">Đoạn mã trên sẽ tạo các SSH key và lưu public key có tag <code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">bao.van@tomosia.com</mark></code> vào <code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">~/.ssh/id_rsa_work.pub</mark></code>.</p>



<p class="wp-block-paragraph">Khi được yêu cầu vị trí lưu SSH key, hãy chấp nhận vị trí mặc định bằng cách nhấn enter. Key private và key public <mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code><em>~/.ssh/id_rsa_work.pub</em> </code></mark>sẽ được tạo tại vị trí ssh mặc định<mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code> ~/.ssh/</code></mark>. Chúng ta đã tạo được ssh key cho account phục vụ công việc, tương tự cho email phục vụ mục đích cá nhân. Tôi đặt tên cho ssh key cá nhân là <strong>id_rsa_personal</strong>. Sau khi tạo xong chúng ta sẽ có 2 key dưới:</p>



<pre class="wp-block-code"><code>~/.ssh/id_rsa_personal
~/.ssh/id_rsa_work</code></pre>



<h2 id="them-ssh-key-moi-vao-tai-khoan-github-tuong-ung" class="wp-block-heading">Thêm SSH key mới vào tài khoản GitHub tương ứng</h2>



<p class="wp-block-paragraph">Chúng ta đã có SSH public key và chúng ta sẽ thêm chúng tài khoản GitHub của mình.</p>



<p class="wp-block-paragraph">Sao chép public key <code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">pbcopy &lt; ~/.ssh/id_rsa_personal.pub</mark></code> rồi đăng nhập vào tài khoản GitHub cá nhân của bạn:</p>



<ul class="wp-block-list">
<li>Đi tới <em><strong>Setting</strong></em></li>



<li>Chọn <em><strong>SSH Key and GPG</strong></em> từ menu bên trái.</li>



<li>Nhấp vào <em><strong>New SSH Key</strong></em>, cung cấp tiêu đề phù hợp và dán nội dung của SSH key vào editor bên dưới</li>



<li>Nhấp vào <em><strong>Add Key</strong></em> &#8211; <strong>Done</strong>!</li>
</ul>



<p class="wp-block-paragraph">Đối với tài khoản công việc, hãy sử dụng public key tương ứng (<mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code>pbcopy &lt; ~/.ssh/id_rsa_work.pub</code></mark>) và lặp lại các bước trên trong tài khoản công việc GitHub của bạn.</p>



<h2 id="dang-ky-ssh-key-voi-ssh-agent" class="wp-block-heading">Đăng ký SSH Key với SSH Agent</h2>



<p class="wp-block-paragraph">Để sử dụng các key, phải đăng ký chúng với ssh agent trên máy của mình. Đảm bảo ssh-agent đang chạy bằng lệnh<code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color"> eval "$(ssh-agent -s)"</mark></code>.</p>



<p class="wp-block-paragraph">Thêm private key vào <em><strong>ssh-agent</strong></em> như sau:</p>



<pre class="wp-block-code"><code>ssh-add ~/.ssh/id_rsa_personal
ssh-add ~/.ssh/id_rsa_work</code></pre>



<p class="wp-block-paragraph">Sau đó, làm cho <strong>ssh-agent </strong>sử dụng các SSH Keys tương ứng cho các SSH Hosts khác nhau bằng cách sử dụng file config cấu hình cho SSH.</p>



<h2 id="tao-tep-cau-hinh-ssh" class="wp-block-heading">Tạo tệp cấu hình SSH</h2>



<p class="wp-block-paragraph">Tệp cấu hình SSH sẽ có tại <em><code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">~/.ssh/config</mark></code></em>. Chỉnh sửa nó nếu nó tồn tại, nếu không chúng ta có thể tạo nó.</p>



<pre class="wp-block-code"><code>cd ~/.ssh/
touch config           // Creates the file if not exists
nano config            // edit file</code></pre>



<p class="wp-block-paragraph">Tạo các mục cấu hình cho các tài khoản GitHub có liên quan tương tự như mục bên dưới trong tệp <em><code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">~/.ssh/config</mark></code></em> của bạn:</p>



<pre class="wp-block-code"><code># Personal account
Host github.com
   HostName github.com
   User git
   IdentityFile ~/.ssh/id_rsa_personal
   
# Work account
Host github.com-work
   HostName github.com
   User git
   IdentityFile ~/.ssh/id_rsa_work</code></pre>



<p class="wp-block-paragraph"><mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code>work</code></mark> là id người dùng GitHub cho tài khoản công việc.</p>



<p class="wp-block-paragraph"><code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">github.com-work</mark></code> là ký hiệu được sử dụng để phân biệt nhiều tài khoản Git. Đảm bảo bạn nhất quán với ký hiệu tên máy chủ mà bạn sử dụng. Điều này có liên quan khi ta clone một repository hoặc set the remote origin cho repository ở local</p>



<p class="wp-block-paragraph">Cấu hình trên yêu cầu ssh-agent:</p>



<p class="wp-block-paragraph">Sử dụng key <code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">id_rsa_personal</mark></code> cho bất kỳ URL Git nào sử dụng <mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code>@github.com</code></mark></p>



<p class="wp-block-paragraph">Sử dụng key <mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code>id_rsa_work</code></mark> cho bất kỳ URL Git nào sử dụng <code><mark style="background-color:#e9ecef" class="has-inline-color has-black-color">@github.com-work</mark></code></p>



<p class="wp-block-paragraph">Như vậy là ta đã hoàn thành xong việc config để sử dụng 2 tài khoản Github. Thử clone một repository hoặc làm việc với một repo ở local nhé.</p>



<h2 id="clone-repository" class="wp-block-heading">Clone Repository</h2>



<p class="wp-block-paragraph">Khi các cấu hình đã ổn, chúng ta có thể tiếp tục và clone các repository tương ứng. Khi clone, ta chỉ cần sử dụng các Host là github.com cho account personal và github.com-work cho account work. Ví dụ như dưới.</p>



<p class="wp-block-paragraph">Với account cho công việc: </p>



<pre class="wp-block-code"><code>git clone git@github.com-work:TOMOSIA-VIETNAM/tomogpt.git</code></pre>



<p class="wp-block-paragraph">Và account cá nhân:</p>



<pre class="wp-block-code"><code>git clone git@github.com:BaoVanPhu/django-learning.git</code></pre>



<p class="wp-block-paragraph">Thay đổi này được thực hiện tùy thuộc vào <strong>Host</strong> được xác định trong tệp config SSH. Giữa @ và : phải khớp với những gì ta đã cung cấp trong tệp config SSH.</p>



<h2 id="local-repository" class="wp-block-heading">Local Repository</h2>



<h3 id="voi-repository-da-duoc-cloned-truoc-do" class="wp-block-heading">Với repository đã được cloned trước đó:</h3>



<p class="wp-block-paragraph">Ta chỉ cần update lại remote-url như lệnh dưới</p>



<p class="wp-block-paragraph">Với account công việc: </p>



<pre class="wp-block-code"><code>git remote set-url origin git@github.com-work:yamatabitabi/ytb-ec-site.git</code></pre>



<p class="wp-block-paragraph">Tương tự cho account cá nhân 😀</p>



<h3 id="neu-tao-mot-repository-moi-o-local" class="wp-block-heading">Nếu tạo một repository mới ở local:</h3>



<p class="wp-block-paragraph">Khởi tạo Git trong thư mục dự án <mark style="background-color:#e9ecef" class="has-inline-color has-black-color"><code>git init</code></mark>.</p>



<p class="wp-block-paragraph">Tạo một repo mới trong tài khoản GitHub rồi  add Git remote vào repo ở local</p>



<pre class="wp-block-code"><code>git remote add origin git@github.com-work:TOMOSIA-VIETNAM/new_repo.git </code></pre>



<p class="wp-block-paragraph">Sau đó add file và commit rồi push code lên thôi.</p>



<p class="wp-block-paragraph">Account cá nhân thì như bình thường rồi, không có gì phải bàn =))</p>



<p class="wp-block-paragraph">Done!</p>



<h2 id="conclusion" class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">Đây là những kinh nghiệm mình đã được đọc và config ở laptop của mình. Hi vọng sẽ có ích cho mọi người.</p>



<p class="wp-block-paragraph">Cảm ơn mọi người đã dành thời gian để đọc. 😀</p>



<p class="wp-block-paragraph"><em>Nguồn: <a href="https://www.freecodecamp.org/news/manage-multiple-github-accounts-the-ssh-way-2dadc30ccaca/" target="_blank" rel="noreferrer noopener">Freecodecamp</a></em></p>
<p>The post <a href="https://blog.tomosia.com.vn/cach-su-dung-nhieu-tai-khoan-github-tren-mot-thiet-bi-bang-ssh-key/">Cách sử dụng nhiều tài khoản GitHub trên một thiết bị bằng SSH Key</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/cach-su-dung-nhieu-tai-khoan-github-tren-mot-thiet-bi-bang-ssh-key/feed/</wfw:commentRss>
			<slash:comments>15</slash:comments>
		
		
			</item>
		<item>
		<title>Sử dụng tính năng git rebase -i HEAD~N để Gộp và Squash Commit trong Git</title>
		<link>https://blog.tomosia.com.vn/su-dung-tinh-nang-git-rebase-i-headn-de-gop-va-squash-commit-trong-git/</link>
					<comments>https://blog.tomosia.com.vn/su-dung-tinh-nang-git-rebase-i-headn-de-gop-va-squash-commit-trong-git/#comments</comments>
		
		<dc:creator><![CDATA[Tăng Quốc Việt]]></dc:creator>
		<pubDate>Tue, 07 Nov 2023 09:00:37 +0000</pubDate>
				<category><![CDATA[Git]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=1671</guid>

					<description><![CDATA[<p>Trong Git, tính năng git rebase là một công cụ mạnh mẽ giúp bạn tích hợp các thay&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/su-dung-tinh-nang-git-rebase-i-headn-de-gop-va-squash-commit-trong-git/">Sử dụng tính năng git rebase -i HEAD~N để Gộp và Squash Commit trong Git</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Trong Git, tính năng <code>git rebase</code> là một công cụ mạnh mẽ giúp bạn tích hợp các thay đổi từ một nhánh sang nhánh khác. <code>Git merge</code> là một công cụ khác cho việc này, nhưng <code>git rebase</code> cho phép bạn thay đổi lịch sử commit một cách linh hoạt. Trong bài viết này, chúng ta sẽ tìm hiểu về cách sử dụng <code>git rebase -i HEAD~N</code> để gộp và squash các commit trong Git.</p>



<p class="wp-block-paragraph"><strong>Rebase là gì?</strong></p>



<p class="wp-block-paragraph">Rebase là quá trình di chuyển hoặc kết hợp một chuỗi commit vào một commit cơ sở mới. Quá trình này thường được sử dụng trong ngữ cảnh làm việc với các tính năng trên các nhánh riêng biệt. Rebase thực hiện việc này bằng cách tạo các commit mới và áp dụng chúng vào commit cơ sở đã chỉ định. Quan trọng nhất, ngay cả khi nhánh trông giống như trước, nó thực sự bao gồm các commit hoàn toàn mới.</p>



<p class="wp-block-paragraph"><strong>Tại sao cần sử dụng Rebase?</strong></p>



<p class="wp-block-paragraph">Mục tiêu chính của việc sử dụng rebase là duy trì lịch sử commit dự án theo hình thẳng, giúp dễ quản lý. Khi bạn đang làm việc trên một tính năng riêng (feature branch) và muốn cập nhật các thay đổi mới nhất từ nhánh chính (main branch), bạn có hai lựa chọn: gộp trực tiếp hoặc sử dụng rebase trước rồi mới gộp. Sử dụng rebase trước khi gộp giúp giữ cho lịch sử commit trông sạch sẽ, như là bạn đã luôn làm việc trên nhánh chính. Khi bạn duyệt lịch sử commit, việc này giúp bạn nhanh chóng hiểu về lịch sử dự án.</p>



<p class="wp-block-paragraph"><strong>Sử dụng <code>git rebase -i HEAD~N</code> với Squash</strong></p>



<p class="wp-block-paragraph">Tính năng quan trọng trong việc sử dụng rebase là <code>git rebase -i</code>, với <code>-i</code> viết tắt của &#8220;interactive,&#8221; cho phép bạn tương tác với các commit trong quá trình rebase. Khi bạn chạy lệnh <code>git rebase -i HEAD~N</code>, bạn có thể chỉ định N là số commit bạn muốn gộp.</p>



<ul class="wp-block-list">
<li><code>pick</code> (p): Sử dụng commit.</li>



<li><code>reword</code> (r): Sử dụng commit và cho phép chỉnh sửa lại mô tả.</li>



<li><code>edit</code> (e): Sử dụng commit, nhưng dừng lại để chỉnh sửa.</li>



<li><code>squash</code> (s): Sử dụng commit và gộp vào commit trước đó.</li>



<li><code>fixup</code> (f): Giống như squash, nhưng bỏ qua mô tả của commit này.</li>



<li><code>exec</code> (x): Chạy một lệnh từ dòng dưới bằng shell.</li>



<li><code>drop</code> (d): Loại bỏ commit.</li>
</ul>



<p class="wp-block-paragraph">Ví dụ về <code>squash</code>:</p>



<p class="wp-block-paragraph">Nếu bạn có các commit sau đây:</p>



<ol class="wp-block-list">
<li>Commit 1: &#8220;Change headlines for about and index&#8221;</li>



<li>Commit 2: &#8220;Optimize markup structure in index&#8221;</li>



<li>Commit 3: &#8220;Change page structure&#8221;</li>
</ol>



<figure class="wp-block-video"><video controls src="https://www.git-tower.com/learn/media/pages/git/faq/git-squash/cf8269801a-1697824976/cli-interactive-rebase.mp4"></video></figure>



<p class="wp-block-paragraph">Nếu bạn muốn gộp commit 2 và 3 vào commit 1, bạn chỉ cần thay đổi <code>pick</code> thành <code>squash</code> hoặc viết tắt là <code>s</code> cho commit 2 và 3 trong giao diện tương tác rebase. Sau đó, bạn có thể chỉnh sửa lại mô tả của commit mới (thường là kết hợp mô tả của tất cả các commit được gộp). Kết quả là một commit mới có mô tả là &#8220;Add feature A&#8221; chứa tất cả thay đổi từ cả ba commit ban đầu.</p>



<p class="wp-block-paragraph"><strong>Chú ý quan trọng:</strong></p>



<ul class="wp-block-list">
<li>Không nên sử dụng rebase cho lịch sử commit đã được đẩy lên kho lưu trữ công cộng, vì nó có thể làm mất lịch sử.</li>



<li>Interactive rebase cho phép bạn kiểm soát hoàn toàn lịch sử dự án, giúp bạn chỉnh sửa và làm sạch lịch sử commit trước khi đưa chúng vào nhánh chính.</li>



<li>Sử dụng <code>git rebase -i HEAD~N</code> cho phép bạn thay đổi nhiều commit cùng lúc, tạo ra một lịch sử commit sáng sủa và dễ quản lý hơn.</li>
</ul>



<p class="wp-block-paragraph"><strong>Kết luận:</strong></p>



<p class="wp-block-paragraph">Tính năng <code>git rebase -i HEAD~N</code> là một công cụ mạnh mẽ trong Git cho phép bạn tương tác với và chỉnh sửa lịch sử commit dự án. Sử dụng <code>squash</code> với rebase cho phép bạn gộp và làm sạch lịch sử commit, giúp bạn tạo ra một lịch sử commit đồng nhất và có ý nghĩa cho dự án của bạn.</p>
<p>The post <a href="https://blog.tomosia.com.vn/su-dung-tinh-nang-git-rebase-i-headn-de-gop-va-squash-commit-trong-git/">Sử dụng tính năng git rebase -i HEAD~N để Gộp và Squash Commit trong Git</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/su-dung-tinh-nang-git-rebase-i-headn-de-gop-va-squash-commit-trong-git/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		<enclosure url="https://www.git-tower.com/learn/media/pages/git/faq/git-squash/cf8269801a-1697824976/cli-interactive-rebase.mp4" length="686950" type="video/mp4" />

			</item>
		<item>
		<title>Khôi phục commit sau khi git reset &#8211;hard và push &#8211;force! Lấy độc trị độc !</title>
		<link>https://blog.tomosia.com.vn/khoi-phuc-commit-sau-khi-git-reset-hard-va-push-force-lay-doc-tri-doc/</link>
					<comments>https://blog.tomosia.com.vn/khoi-phuc-commit-sau-khi-git-reset-hard-va-push-force-lay-doc-tri-doc/#comments</comments>
		
		<dc:creator><![CDATA[admin_tomosia]]></dc:creator>
		<pubDate>Sun, 08 Oct 2023 17:30:47 +0000</pubDate>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[git]]></category>
		<guid isPermaLink="false">https://blog.tomosia.com.vn/?p=1007</guid>

					<description><![CDATA[<p>Hí huynh đệ ! Tại hạ là saiury92 đây ! Trong đây có huynh đài nào là fan của truyện&#8230;</p>
<p>The post <a href="https://blog.tomosia.com.vn/khoi-phuc-commit-sau-khi-git-reset-hard-va-push-force-lay-doc-tri-doc/">Khôi phục commit sau khi git reset &#8211;hard và push &#8211;force! Lấy độc trị độc !</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hí huynh đệ ! Tại hạ là <a rel="noreferrer noopener" href="https://saiury92.github.io/" target="_blank">saiury92 </a>đây ! Trong đây có huynh đài nào là fan của truyện kiếm hiệp Kim Dung không ? Các hạ hãy comment ở bình luận để tại hạ được diện kiến !</p>



<p class="wp-block-paragraph">Trong thế giới võ hiệp của cố nhà văn Kim Dung, trúng độc có thể nói là nỗi ám ảnh của hầu hết các nhân sĩ khi hành tẩu giang hồ. Bên cạnh đó cũng sinh ra vô vàn phương pháp chữa độc như sử dụng thuốc giải độc, hay là dùng nội công để chữa ! Khi các phương pháp trên đều vô phương cứu chữa, một phương pháp nguy hiểm ngang đánh tài xỉu được sử dụng ! Đó chính là &#8220;<em>Lấy độc trị độc</em>&#8221; . Trong bộ tiểu thuyết Thiên long bát bộ, Đoàn Dự đã bị trúng độc của Lục Mạch Thần Kiếm, chính Huyền Minh Nhị Lão là người đã sử dụng một loại độc khác để trung hòa độc của Lục Mạch Thần Kiếm.</p>



<p class="wp-block-paragraph">Vâng ! Quay về thực tại ! Bạn đã bao giờ bị thằng làm cùng, nó vừa code nó vừa chửi &#8220;<em>Đ* M* ! Thằng nào push code làm mất m* commit của bố mày rồi !</em>&#8220;. Có thể lúc đó bạn đã vô tình <mark style="background-color:#e9ecef" class="has-inline-color">git reset &#8211;hard</mark> hay chỉ là nhỡ tay <mark style="background-color:#e9ecef" class="has-inline-color">push &#8211;force</mark> lên thôi ! Làm đ*o gì mà căng !</p>



<p class="wp-block-paragraph">Hôm nay, tại hạ xin hướng dẫn các vị huynh đài, sử dụng phương pháp lấy độc trị độc, dùng chính <mark style="background-color:#e9ecef" class="has-inline-color">git reset &#8211;hard</mark> và <mark style="background-color:#e9ecef" class="has-inline-color">push &#8211;force</mark> để khôi phục lại commit đã mất !</p>



<h4 id="bai-toan" class="wp-block-heading"><strong>Bài toán ?</strong></h4>



<p class="wp-block-paragraph">Tại hạ đang có 3 commit, lỡ tay <mark style="background-color:#e9ecef" class="has-inline-color">git reset &#8211;hard</mark> và <mark style="background-color:#e9ecef" class="has-inline-color">push &#8211;force</mark> lên còn có 1 commit !</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="6c01759 (HEAD -&gt; master, origin/master) Commit 3
842ed8d Commit 2
786ca7f Commit 1

&gt; git reset --hard 786ca7f &amp; git push --force origin master

786ca7f (HEAD -&gt;  master, origin/master) Commit 1" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #50FA7B">6c01759</span><span style="color: #F8F8F2"> (HEAD -</span><span style="color: #FF79C6">&gt;</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">master,</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">origin/master</span><span style="color: #F8F8F2">) Commit 3</span></span>
<span class="line"><span style="color: #50FA7B">842ed8d</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">Commit</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span></span>
<span class="line"><span style="color: #50FA7B">786ca7f</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">Commit</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">1</span></span>
<span class="line"></span>
<span class="line"><span style="color: #FF79C6">&gt;</span><span style="color: #F8F8F2"> git reset --hard 786ca7f &amp; </span><span style="color: #50FA7B">git</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">push</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">--force</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">origin</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">master</span></span>
<span class="line"></span>
<span class="line"><span style="color: #50FA7B">786ca7f</span><span style="color: #F8F8F2"> (HEAD -</span><span style="color: #FF79C6">&gt;</span><span style="color: #F8F8F2">  </span><span style="color: #F1FA8C">master,</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">origin/master</span><span style="color: #F8F8F2">) Commit 1</span></span></code></pre></div>



<h4 id="lay-doc-tri-doc" class="wp-block-heading"><strong>Lấy độc trị độc ?</strong></h4>



<p class="wp-block-paragraph">Sử dụng <mark style="background-color:#e9ecef" class="has-inline-color has-black-color">git reflog</mark> hiển thị tất cả các commit, bao gồm cả những commit đã bị xóa ! Lưu ý: <mark style="background-color:#e9ecef" class="has-inline-color">git log</mark> chỉ hiển thị những commit hiện tại.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="786ca7f (HEAD -&gt; master, origin/master) HEAD@{0}: reset: moving to 786ca7f # log when git reset
6c01759 HEAD@{1}: commit: Commit 3 # commit cần khôi phục
842ed8d HEAD@{2}: commit: Commit 2
786ca7f (HEAD -&gt; master) HEAD@{3}: commit (initial): Commit 1" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #50FA7B">786ca7f</span><span style="color: #F8F8F2"> (HEAD -</span><span style="color: #FF79C6">&gt;</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">master,</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">origin/master</span><span style="color: #F8F8F2">) HEAD@{</span><span style="color: #50FA7B">0}:</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">reset:</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">moving</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">to</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">786</span><span style="color: #F1FA8C">ca7f</span><span style="color: #F8F8F2"> </span><span style="color: #6272A4"># log when git reset</span></span>
<span class="line"><span style="color: #50FA7B">6c01759</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">HEAD@{</span><span style="color: #BD93F9">1</span><span style="color: #F1FA8C">}:</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">commit:</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">Commit</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">3</span><span style="color: #F8F8F2"> </span><span style="color: #6272A4"># commit cần khôi phục</span></span>
<span class="line"><span style="color: #50FA7B">842ed8d</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">HEAD@{</span><span style="color: #BD93F9">2</span><span style="color: #F1FA8C">}:</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">commit:</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">Commit</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span></span>
<span class="line"><span style="color: #50FA7B">786ca7f</span><span style="color: #F8F8F2"> (HEAD -</span><span style="color: #FF79C6">&gt;</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">master</span><span style="color: #F8F8F2">) HEAD@{</span><span style="color: #50FA7B">3}:</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">commit</span><span style="color: #F8F8F2"> (initial): Commit 1</span></span></code></pre></div>



<p class="wp-block-paragraph">Các hạ sẽ thấy được hành vi <mark style="background-color:#e9ecef" class="has-inline-color">git reset</mark> được log lại ! Tìm SHA của commit ngay trước hành vi reset để rollback ! Sử dụng chính <mark style="background-color:#e9ecef" class="has-inline-color">git reset &#8211;hard </mark> khôi phục commit:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="&gt; git reset --hard 6c01759

6c01759 (HEAD -&gt; master) Commit 3
842ed8d Commit 2
786ca7f Commit 1" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">&gt;</span><span style="color: #F8F8F2"> git reset --hard 6c01759</span></span>
<span class="line"></span>
<span class="line"><span style="color: #50FA7B">6c01759</span><span style="color: #F8F8F2"> (HEAD -</span><span style="color: #FF79C6">&gt;</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">master</span><span style="color: #F8F8F2">) Commit 3</span></span>
<span class="line"><span style="color: #50FA7B">842ed8d</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">Commit</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span></span>
<span class="line"><span style="color: #50FA7B">786ca7f</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">Commit</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">1</span></span></code></pre></div>



<p class="wp-block-paragraph">Push lại commit đã khôi phục:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="&gt; git push --force origin master

6c01759 (HEAD -&gt; master, origin/master) Commit 3
842ed8d Commit 2
786ca7f Commit 1" style="color:#F8F8F2;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dracula" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #FF79C6">&gt;</span><span style="color: #F8F8F2"> git push --force origin master</span></span>
<span class="line"></span>
<span class="line"><span style="color: #50FA7B">6c01759</span><span style="color: #F8F8F2"> (HEAD -</span><span style="color: #FF79C6">&gt;</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">master,</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">origin/master</span><span style="color: #F8F8F2">) Commit 3</span></span>
<span class="line"><span style="color: #50FA7B">842ed8d</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">Commit</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">2</span></span>
<span class="line"><span style="color: #50FA7B">786ca7f</span><span style="color: #F8F8F2"> </span><span style="color: #F1FA8C">Commit</span><span style="color: #F8F8F2"> </span><span style="color: #BD93F9">1</span></span></code></pre></div>



<p class="wp-block-paragraph">Dễ quá phải không các vị huynh đệ ! Cổ nhân xưa có câu không làm thì không có lỗi ! Vì vậy các huynh đệ tránh sử dụng <mark style="background-color:#e9ecef" class="has-inline-color">git reset &#8211;hard</mark> và <mark style="background-color:#e9ecef" class="has-inline-color">push &#8211;force</mark> khi nào cờ bí thì mới lôi ra sài thui ! Cảm ơm các vị huynh đài đã nghe xàm xí ! Thân ái và hẹn gặp lại !</p>
<p>The post <a href="https://blog.tomosia.com.vn/khoi-phuc-commit-sau-khi-git-reset-hard-va-push-force-lay-doc-tri-doc/">Khôi phục commit sau khi git reset &#8211;hard và push &#8211;force! Lấy độc trị độc !</a> appeared first on <a href="https://blog.tomosia.com.vn">Tomoshare</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.tomosia.com.vn/khoi-phuc-commit-sau-khi-git-reset-hard-va-push-force-lay-doc-tri-doc/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
			</item>
	</channel>
</rss>
